Ich hatte ein Szenario in C++, das den Destruktor des Kindes in einem Fall aufruft, in dem ich es nicht erwartet hatte. Eine minimale Repro ist unten:Elternklasse mit Standardkonstruktor; Der Destruktor der Kindklasse wird unerwartet aufgerufen
#include <cstdio>
#include <memory>
using namespace std;
class Parent {
public:
};
class Child : public Parent {
public:
~Child() {
printf("Got here\n");
}
};
int
main()
{
shared_ptr<Parent> x(new Child);
}
Normalerweise ist so etwas wie ein Fehler. Der Entwickler beabsichtigt, dass der Child-Destruktor aufgerufen wird und die korrekte Aktion darin besteht, einen leeren virtuellen Destruktor in den Parent einzufügen. Zu meinem Schrecken, sowohl G ++ 4.4.7 (ja, ich weiß, dass es alt ist) und clang 3.4.2 kompilieren Sie das so, dass der Kinddestruktor genannt wird.
Entspricht dies dem Standard?
@chris ja Ich habe überprüft, es tut das Ding, nicht sicher, ob es überhaupt nützlich ist. –
@ n.m., Ich kann nicht sagen, dass ich persönlich einen Bedarf dafür hatte, aber es ist eine gute Sache, wenn du es tust. – chris
@ n.m. Es ist nützlich, weil Sie 'shared_ptr ' verwenden können, um abgeleitete Objekte zu verwalten, ohne den Aufwand eines virtuellen Destruktors –