我有一個C++的場景,在我沒有想到的情況下調用了子的析構函數。一個最小的repro如下:使用默認構造函數的父類;子類'析構函數意外地被稱爲
#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是啊我檢查了一下,它確實是這樣,不確定它是否有用。 –
@ n.m。,不能說我個人對此有需要,但當你這樣做的時候,這是一件好事。 – chris
@ n.m。這很有用,因爲您可以使用'shared_ptr '來管理派生對象,而不需要虛擬析構函數的開銷 –