2017-05-20 7 views
-5
#include <iostream> 
#include <cstring> 
using namespace std; 

class Ghost{ 
public: 
    Ghost(){ 
     strcpy(name, ""); 
     cout << "Ghost(" << name <<")" <<endl; 
    } 

    Ghost(char n[]){ 
     strcpy(name, n); 
     cout << "Ghost(" << name << ")" << endl; 
    } 
    ~Ghost(){ 
     cout <<"~Ghost(" << name << ")" << endl; 
    } 

private: 
    char name[20]; 
}; 

class PacMan{ 
public: 
    PacMan(){ 
     inky = new Ghost("Inky"); 
     pinky = NULL; 
     cout << "PacMan()" << endl; 
    } 

    PacMan(Ghost* other){ 
     inky = NULL; 
     pinky = other; 
     cout << "PacMan(other)" << endl; 
    } 

    ~PacMan(){ 
     if (inky!= NULL) 
      delete inky; 
     cout <<"~PacMan()" << endl; 
    } 

private: 
    Ghost blinky; 
    Ghost *inky; 
    Ghost *pinky; 
}; 

int main(){ 
    PacMan pm1; 
    Ghost* other = new Ghost("other"); 
    PacMan* pm2 = new PacMan(other); 

    delete pm2; 
    delete other; 

    return 0; 
} 

Für dieses Programm es Ausgabe:Die Reihenfolge der destructor

Ghost() 
Ghost(Inky) 
PacMan() 
Ghost(other) 
Ghost() 
PacMan(other) 
~PacMan() 
~Ghost() 
~Ghost(other) 
~Ghost(Inky) 
~PacMan() 
~Ghost() 

wollte ich aus, wo die erste Ausgabe Geist() kommen wissen, und warum die drei letzten Ausgabe nicht

war
~PacMan() 
~Ghost(Inky) 
~Ghost() 

Ich denke, die Reihenfolge der Destruktor ist das Gegenteil der Konstruktor Reihenfolge, ist es wahr?

+1

Das richtige Werkzeug, um solche Probleme zu lösen, ist Ihr Debugger. Sie sollten Schritt für Schritt durch Ihren Code * gehen, bevor Sie auf Stack Overflow nachfragen. Für weitere Hilfe lesen Sie bitte [Wie kleine Programme zu debuggen (von Eric Lippert)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Zumindest sollten Sie Ihre Frage so bearbeiten, dass sie ein [minimales, vollständiges und verifizierbares] (http://stackoverflow.com/help/mcve) Beispiel enthält, das Ihr Problem zusammen mit den Beobachtungen, die Sie im Debugger gemacht haben, reproduziert . –

+0

'löschen nullptr;' ist legal. 'if (p! = nullptr) delete p;' ist ein Anti-Muster. – IInspectable

Antwort

0

Der erste Geist ist der PacMan Mitglied blinky.

Über die letzte Bestellung: Destroying pm1 exectutes

~PacMan(){ 
     if (inky!= NULL) 
      delete inky; 
     cout <<"~PacMan()" << endl; 
    } 

und dann blinky wird ebenfalls gelöscht.
Wenn Sie die umgekehrte Reihenfolge möchten, müssen Sie es hier schreiben.