Stack wird nicht freigegeben nach beender der Funktion

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Igell
Beiträge: 27
Registriert: 11. November 2009 20:36

Stack wird nicht freigegeben nach beender der Funktion

Beitrag von Igell »

Hallo,

ihr könntet mir bei einer Verständnis frage behilflich sein.

In einer Funktion Erschaffe ich eine Variable und Instantiiere sie mit einem Wert : int a = 42;
Aus der Funktion gebe ich die Adresse der variable: return &a;
Ein Pointer nimmt diese Adresse auf : int *iptr =0;
iptr = funktion();
Nun Dereferenziere ich den Pointer und gebe den Inhalt aus : cout << *iptr << endl;
Auf dem Bildschirm wird 42 ausgegeben. Die Variable wurde auf dem Stack abgelegt und nach dem verlassen der Funktion wird der Reservierte platz nun wider frei gegeben.
Und genau das ist mein Problem, meiner Meinung nach sollte das eine Speicherverletzung sein und auf dem Bildschirm könnte alles stehen, aber da steht 42.

Warum 42?
Wissen ist die einzige Ressource, die sich vermehrt wenn man sie teilt
Curtis Newton
Beiträge: 122
Registriert: 11. Juni 2008 18:39

Beitrag von Curtis Newton »

Wo steht das, das die Stelle im Speicher ge-xxx-t werden muss. Natürlich ist das nicht mehr gültig und es kann undefiniertes Verhalten auftreten. Aber solange Du an diese Stelle (bzw. das Programm) nichts anderes schreibt, bleibt es halt bestehen.

Lass das Programm doch mal im release-Modus laufen. Stürzt es dann ab?


C.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Das Programm wird erst dann abstürzen, wenn er dort hineinschreibt und das eigene(!) Programm auf diese Daten dann angewiesen ist.
Igell
Beiträge: 27
Registriert: 11. November 2009 20:36

Beitrag von Igell »

Nein Abstürzen tut es nicht, und rufe ich die Variable gleich nach der Funktion auf ist ihr wert = 42.

Code: Alles auswählen

int main(int argc, char *argv[])
{
     int *iptr =0;


     iptr = funk();
     
     cout << "Der wert von iptr " << iptr <<  " Dereferenziert : " << *iptr << endl;


    return 0;
}
Spaßeshalber habe ich mal eine schleife zwischen Funktion und der Ausgabe gesetzt.
Was den Wert Variieren lässt.

P.s. Danke Für die Antwort
Wissen ist die einzige Ressource, die sich vermehrt wenn man sie teilt
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Nein Abstürzen tut es nicht
Aber ich hoffe du hasst das "System" verstanden ?
Das Dein Zeiger immer noch auf die alte speichersstelle zeigt, und das da immer noch 42 drinnsteht, iss maximal "wahrscheinlich", Deshalb wird es als undefiniert bezeichnet. Undefiniertes verhalten iss so ziemlich das schlimmste was haben kannst bei der Programmierung.

Wenn der zeiger mal auf ne gueltige Speicherstelle gezeigt hat, und du interpretierst den wert spaeter irgendwann mal als int, wird das programm kaum abstuerzen, weil egal was da steht, er wird immer irgend nen int draus machen koennen. Aber welcher und in welchen zusammenhang das ist undefiniert fuer dich ....

erst wenn du auf die stelle schreibst(also dem dereferenzierten int was anderes zuweisst), kann richtig boeses passieren. mit viel "Glueck" uebverschreibst ne ruecksprungadresse von ner funktion ... oder was aehnlich sensibles. Und voila, irgendwas stuerzt dein programm unverhofft ab, an ner stelle wo es sicher ned vermutest :-)
Und voila, die lustige fehlersuche kann beginnen.
Ich hoffe dann hasst immer noch Spass an solchen sachen :-)

Ciao ...
Antworten