Frage zu Zeigern
-
Hi, warum geht das ?
class Test { public: double q; explicit Test(int z) { cout << "Explizieter Konstruktor" << endl; } ~Test() { cout << "Destructor" << endl; } }; int main() { Test * pt = 0; { Test t(5); pt = &t; } cout << (pt->q = 4) << " " << pt << endl; //Müsste nach Verlassen des Scopes nicht die Instanz t gelöscht worden sein? //Denn man kann nach dem Scope noch immer mit dem Zeiger pt auf q ohne //Probleme zugreifen ... ?! }Gruß Tim
-
Das Ganze fällt unter undefiniertes Verhalten. In diesen einem Fall kannst du zugreifen. Das muß aber nicht so sein. Das ist eben undefiniert.

-
Und was bedeutet das jetzt ? Hab ich was falsch gemacht ? Also ich mein, is das nicht ein Memoryleak ? Oder, ist der Speicherbereich nur noch nciht überschrieben worden, jedoch freigegeben für neue daten ?!
-
Nein, es ist kein Memoryleak, da nirgends Speicher auf dem Heap angefordert wurde.
Und ja, as Objekt liegt rein zufällig noch im Speicher, weil es noch nicht mit neuen Daten überschrieben wurde. Es kann geradesogut etwas anderes dort stehen, was zu einer Zugriffsverweigerung führen sollte. Deshalb sollte man solche Dinge (wie auch Rückgabe von lokalen Zeigern/Referenzen) vermeiden.
-
Der Speicherbereich ist nach verlassen des Scopes freigegeben und kann überschrieben werden. dein Beispiel funktioniert, weil du zwischen der Freigabe und dem Abruf keine neuen Objekte anlegst. Aber du kanst dich nicht darauf verlassen. Theoretisch dürften sogar andere Programme an die Stelle schreiben, praktisch wird solcher Speicher jedoch in der Regel nicht (sofort) an das OS zurückgegeben.
-
Theoretisch dürften sogar andere Programme an die Stelle schreiben
Und was viel wichtiger ist. Threads können da den Speicher brauchen. Das ein anderes Programm an die Stelle schreibt ist eher unwahrscheinlich.
-
Wie is das eigentlich mit Speicherreservierungen so im Allgemeinen, wird jeder Speicher, der in irgend einer Weise von einem C++-Programm verwendet wird, egal ob er wieder sauber freigegeben wird oder nicht, nach Beendigung eines Programms so oder so wieder für andere Anwendungen freigegeben? Mit anderen Worten: Kann man sich mit c++-Programmen SPeicher "kaputt" machen?

-
TheBrain schrieb:
Wie is das eigentlich mit Speicherreservierungen so im Allgemeinen, wird jeder Speicher, der in irgend einer Weise von einem C++-Programm verwendet wird, egal ob er wieder sauber freigegeben wird oder nicht, nach Beendigung eines Programms so oder so wieder für andere Anwendungen freigegeben? Mit anderen Worten: Kann man sich mit c++-Programmen SPeicher "kaputt" machen?

Mit modernen OS nicht. Da wird alles nach dem Beenden vom OS aufgeräumt.
Allerdings schreibt das der Standard nicht vor. Grundsätzlich ist es also theoretsisch möglich den Speicher zu "zerstören".
-
Der Speicher sollte eigentlich beim Beenden des Programms wieder freigegeben werden. Nur passiert das meistens nicht sofort, sondern braucht eine gewisse Zeit.
-
Spätestens aber nach einem Neustart, oder?
-
TheBrain schrieb:
Spätestens aber nach einem Neustart, oder?
Jo. Aber wie gesagt da musst du dir bei modernen OS keine Sorge machen. Da wird alles aufgeräumt. Allerdings ist das noch kein Grund deinen Speicher nicht aufzuräumen.

-
Ach menno, wollte das gerade als Freifahrtschein zum unsauberen Programmieren betrachten

-
Kann ja auch mal vorkommen, dass der Code auf einer Plattform laufen muss, auf der es kein großartiges OS gibt, dass Dir hinterher räumt.
-
Oder auf einer Plattform die nie neu startet...