非指针成员变量的虚拟析构函数

1 c++ pointers destructor c++11

我有一个关于虚拟析构函数的问题.我知道如果变量指针是多态的,那么创建一个虚拟析构函数是必要的,但是如果我不需要做任何破坏,那么特定代码是否必要?

例如,以下代码:

struct Foo
{
    struct ExtraData
    {
        int myType;
    }
    struct BarData : public ExtraData
    {
        std::string myName;
        float myFoo;
    }
    struct BooData : public ExtraData
    {
        int myBoo;
        double myTime;
    }
    Foo() {}
    ~Foo() { delete myExtradata; }

    int myA;
    int myB;
    ExtraData* myExtraData;
};
Run Code Online (Sandbox Code Playgroud)

myExtraData是从struct外部创建的,它可以通过new BarData()或通过新的BooData().BarData和BooData是否需要虚拟析构函数.或者因为他们没有成员指针,这没关系?

Jar*_*d42 6

打电话给UB:

Base* base = new Derived;
delete base; // UB here if ~Base is not virtual.
Run Code Online (Sandbox Code Playgroud)

除非析构者Basevirtual.

5.3.5/3删除

在第一个替代(删除对象)中,如果操作数的静态类型与其动态类型不同,则静态类型应为操作数的动态类型的基类,静态类型应具有虚拟析构函数或行为未定义.在第二个备选(删除数组)中,如果要删除的对象的动态类型与其静态类型不同,则行为是未定义的.73)

在您的情况下,"操作数的静态类型"是" ExtraData和它的动态类型"是BarDataBooData.所以它们是不同的,静态类型ExtraData必须有一个虚拟析构函数.