2017-05-19 1 views
0

Für diese Frage ist der Ausgang CCCDCDD, und wenn ich das func() in der Hauptfunktion lösche, wird der Ausgang CCCDDD, ich verstehe die ersten 3 C, woher es kommt, aber ich verstehe nicht Bleib, bitte erkläre es, danke.Wie funktionieren der Konstruktor und der Destruktor?

+0

'für (int i = 0; i <1; i ++)' führt im Wesentlichen seinen Block einmal aus, so auch 'if (true)'. Wenn Sie einen Bereich definieren möchten, können Sie einfach ein Paar Klammern ('{}') verwenden. Sie müssen sie nicht im Kontext einer Flow-Control-Anweisung verwenden. Sie könnten einfach 'int main() {Foo a; {Foo b; {Foo c; } func(); } zurückgeben 0; } ' –

+2

Das Durchlaufen mit einem Debugger könnte helfen ... – Borgleader

+0

' p = NULL; 'zerstört das Objekt nicht wirklich. Das "neue Foo" -Objekt ist durchgesickert. Diese Zeile sollte 'delete p;' lauten. – cdhowie

Antwort

2
  1. C - a
  2. C konstruiert - b aufgebaut ist
  3. C - c aufgebaut ist
  4. D - c desctructed ist becouse Sie den Umfang
  5. C verlassen - ein Objekt Foo dynamisch ist zugewiesen und auf p gezeigt, aber da es dynamisch zugewiesen und nie gelöscht wird, wird es nie zerstört.
  6. D - b ist
  7. D destructed - a
1

destructed gibt es damit CCCDCDD wäre:

  1. C - Construct A
  2. C - Construct B
  3. C - Konstruieren C
  4. D - Zerstören C
  5. C - Konstrukt p (in func)
  6. D - Destruct B
  7. D - A Destruct

// memleak für p (in func)

0

Wenn der func(); Anruf enthalten ist, das nommenen Schritte sind:

Foo a; -> C 

Foo b; -> C 

Foo c; -> C 

Left the scope of Foo c -> D 

func(); call -> 
    new Foo; -> C 

Finished func() call, left the scope of Foo b -> D 

Left the scope of Foo a -> D 

Beachten Sie, dass das Objekt Foo in func() erstellt wurde nie destrukturiert wird, das heißt, Sie einen Speicherverlust haben.

1

Der Umfang des Objekts a ist der Umfang des äußeren Codeblocks der Funktion main. Es ist das erste Objekt, das erstellt wird, und das letzte Objekt, das gelöscht wird.

int main(){ 
    Foo a; 
    // ... 
    return 0; 
} 

C C C D C D D 
|   | 
a   a 

Dann wird in der for-Schleife, die nur eine Iteration hat es das Objekt erstellt wird b die

nach der ersten Iteration der Schleife wird gelöscht
for (int i=0; i<1; i++){ 
    Foo b; 
    // ... 
} 

C C C D C D D 
| |  | | 
a b  b a 

dann im Block Umfang der Anweisung, wenn

if (true){ 
     Foo c; 
    } 

wird erstellt und gelöscht das Objekt c

C C C D C D D 
| | | | | | 
a b c c b a 

Danach wird die Funktion func genannt wird

func(); 

Innerhalb der Funktion wird ein unbenanntes Objekt mit dem Operator neu und auf den durch den Zeiger p erstellt.

Dieses Objekt wird nicht gelöscht, da der Operator delete für dieses Objekt nicht aufgerufen wird. Es gibt also ein Speicherleck.

Das ist alles.

Verwandte Themen