私はそれを期待していない場合に子のデストラクタを呼び出すC++のシナリオを持っていました。最小限の再現率は以下のとおりです。デフォルトコンストラクタを使用する親クラス。子クラスのデストラクタが予期せず呼び出されました
#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);
}
通常、これはバグです。開発者は、子デストラクタが呼び出されることを意図しており、正しいアクションは親に空の仮想デストラクタを挿入することです。しかし、私のショックでは、G ++ 4.4.7(ええ、私はそれが古いと知っています)と3.4.2をコンパイルして、子デストラクタがと呼ばれるようにコンパイルします。
これは標準に準拠していますか?
@chris yeah私はそれをチェックしました。それはまったく役に立ちません。 –
@ n.m。私が個人的にそれを必要としているとは言えませんが、あなたがそうしたときにはいいことです。 – chris
@ n.m。仮想デストラクタ –