-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?
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 . –
'löschen nullptr;' ist legal. 'if (p! = nullptr) delete p;' ist ein Anti-Muster. – IInspectable