Seite 1 von 1

Stack wird nicht freigegeben nach beender der Funktion

Verfasst: 28. Januar 2010 13:41
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?

Verfasst: 28. Januar 2010 13:46
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.

Verfasst: 28. Januar 2010 17:21
von upsala
Das Programm wird erst dann abstürzen, wenn er dort hineinschreibt und das eigene(!) Programm auf diese Daten dann angewiesen ist.

Verfasst: 28. Januar 2010 17:36
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

Verfasst: 29. Januar 2010 10:43
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 ...