Es gibt 2 "Typen" variabler Lebensdauer in C++. Dynamisch und automatisch.
Automatik ist so etwas wie:
void foo()
{
int i; // automatic storage
} // destroys i
Hier finden i
den Moment es Rahmen verlässt zerstört werden (nach foo
Returns).Sie können diese für sich selbst überprüfen, indem Sie Ihr Objekt eine automatische Lebensdauer machen:
int main()
{
A a; // calls A's constructor and allocates memory.
} //calls A's destructor and frees the memory used.
Sie werden sehen, dass sowohl der Konstruktor und der Destruktor wird aufgerufen.
Die zweite Form ist dynamisch zugeordneter Speicher. Sie können Speicher dynamisch zuweisen, indem Sie new
verwenden (wie Sie) und diesen Speicher freigeben, indem Sie delete
verwenden. Der Compiler wird nicht dies für Sie tun. Das bedeutet, dass zerstören Ihr Objekt, das Sie sich delete
explizit aufrufen müssen:
int main()
{
A* a = new A();
delete a; // calls A's destructor and frees the memory used.
}
Wenn Sie delete
nicht nennen (wie Ihr Code), dann in dem Moment das Programm verlässt main
der Zeiger a
zerstört wird und wir jetzt Habe ein Stück Speicher, dass nichts erreichen kann und damit niemand aufräumen kann (mit delete
) was bedeutet, du bist leaking memory.
Moderne Betriebssysteme beanspruchen jedoch automatisch den gesamten Speicher, der vom Programm verwendet wird, sobald das Programm beendet ist, zu diesem Zeitpunkt ist es nicht mehr wichtig. Dies bedeutet, dass Ihr Destruktor nicht so aufgerufen wird, wie Sie gerade gesehen haben.
dynamisch zugewiesenen Speicher ermöglicht es Ihnen, wie die Steuerung der Lebensdauer Ihrer Objekte zu dem Punkt, einige nette Tricks zu tun, wo man sie explizit mit delete
selbst zerstören wollen. Das Problem mit der Verwendung new
und delete
ist, dass es so einfach ist, eine einzige delete
zu vergessen, und Ihr Programm wird bereits Speicher auslaufen, weshalb es ratsam ist, weg von dieser Art der Zuweisung zu bleiben.
Wenn aus irgendeinem Grund absolut Sie dynamische Lebensdauer benötigen dann einen intelligenten Zeiger wie std::unique_ptr
verwenden, die new
und delete
für Sie der Moment nennen es den Gültigkeitsbereich verlässt.
"Destructor wird implizit vom Compiler beim Beenden des Programms aufgerufen" ist falsch. –