2016-04-18 10 views
-2

Ich habe folgende C++ Klasse:Wann sterben Variablen für öffentliche Mitglieder ab?

class DEF 
{ 
    //... 
} 

class ABC 
{ 
    public: 
     DEF my_def; 
     ~ABC(); 
    //... 
} 

Und irgendwo:

ABC* abc = new ABC(...); 
delete abc; 

Meine Frage:

Wird my_def zugänglich sein, nachdem abc löschen Aufruf? Ist es sicher, abc->my_def.somefunc()nach das Löschen zu tun? -

+3

Wenn Datenmitglieder sterben hat nichts damit zu tun, ob sie öffentlich sind oder nicht. – juanchopanza

+1

_ "Ist es nach dem Löschen sicher abc-> my_def.somefunc()?" _ Nein. Das ist undefiniertes Verhalten. –

+0

Nein. Das Objekt wurde gelöscht. Wenn du 'my_def' behalten willst, solltest du es woanders speichern. –

Antwort

4

Nein, nachdem der Destruktor abc ausgeführt wurde, werden seine Mitglieder in umgekehrter Reihenfolge ihrer Deklaration zerstört. Wenn abc gelöscht wird, ist sein gesamter Speicher frei. Das beinhaltet my_def in Ihrem Beispiel.

Vielleicht wird diese Frage für Sie nützlich sein: What is a smart pointer and when should I use one?

Nachtrag: Ein großes Problem mit C++ ist undefined behavior. Programmierfehler wie use-after-free funktionieren möglicherweise 80% der Zeit, wenn der Speicher in der Zwischenzeit nicht wiederverwendet wurde. Aber wahrscheinlich überschreiben Sie nicht verwandten Speicher und/oder ermöglichen das Lesen von fremden Daten. Das ist ein ernstes Sicherheitsproblem, und ein Absturzprogramm ist das Beste, worauf Sie zu diesem Zeitpunkt hoffen können.

+0

my_def ist eine Kopie, kein Zeiger ... –

+0

@ 今天 you verwechseln Sie C++ für eine speicherverwaltete Sprache wie Java oder Python. Bitte lesen Sie die Antwort in der verknüpften Frage und suchen Sie nach einem Konzept, das Sie nicht verstehen. – kay

Verwandte Themen