Es ist mir einfach passiert, dass ich mich gefragt habe, wie Ressourcen im folgenden Fall freigegeben werden.Was passiert mit dem Destruktor der Basisklasse, wenn ein abgeleiteter Klassendestruktor eine Exception auslöst
class Base {
Resource *r;
public:
Base() { /* ... */ }
~Base() {
delete r;
}
};
class Derived : public Base {
public:
Derived() { /* ... */ }
~Derived() {
/* Suddenly something here throws! */
}
};
int main() {
try {
Derived d;
} catch(...) {
/* what happened with Base::r !? */
}
}
Wird der Basisklassendestruktor aufgerufen, wenn der abgeleitete Klassendestruktor auswirft? Oder wird es ein Leck geben?
Aus dem Gedächtnis, der Standard der Definitionen dessen, was geschieht, wenn ein destructor Würfe sind so unglaublich komplex und in der Regel schrecklich, dass niemand jemals, jemals von einem destructor wirft. Ich bin auch ziemlich sicher, dass alle Standard-Container davon ausgehen, dass Destruktoren nicht durchgehen. Grundsätzlich, obwohl ich technisch denke, ist es legal und definiert, die Realität ist, dass niemand es tut und aus einem sehr guten Grund, also tu es nie. – Puppy
Die Probe, die Sie dort haben, sollte kein Problem sein. d geht nur normal aus dem Rahmen. Wo es dreckig werden könnte, ist, dass der Grund dafür ist, dass der Stapel im Zuge der Handhabung einer weiteren Ausnahme wieder abgewickelt wird. Diese Möglichkeit führt zu Faustregeln darüber, niemals einen Destruktor einzuwerfen. –