在 non-virtual 析构函数的情况下自动调用 parent 析构函数?

Automatic calling of parent destructor in case of non-virtual destructor?

我有一个 struct O,在第三方代码中定义。因为它是 C 代码,所以它没有定义 virtual destructor。 (在我的例子中,它是来自 win32 appi 的 OVERLAPPED struct)。

我正在修改的客户代码有一个 class S,派生自 class A,派生自 struct O

struct O{};
class A : public O{};
class S : public A{};

None 其中 将其析构函数声明为 virtual.

如果在指向 O 的指针上调用 delete 就会发生泄漏。当然。

但是,如果我在指向 S 的指针上调用 delete,C++ 标准是怎么说的呢? 它会自动调用 parent class 的析构函数,即使 none 已经声明了它们的析构函数 virtual 吗?它会释放 parent 的相对内存区域吗?

S * pS = new S;
delete S; // would this call the parent destructor?

关于

S * pS = new S;
delete S; // would this call the parent destructor?

是的。 除了析构函数可能是一个微不足道的什么都不做的析构函数。

当然,派生的 class 析构函数的每次调用都会导致所有父 class 的析构函数调用。但是,如果删除的 class 是指向没有虚拟析构函数的基 class 的指针,则不会调用派生的 class 析构函数(可能的资源泄漏)

struct A {};
struct B : A {};
struct C : B {};

int main() {
    B* p = new C;
    // This will clean up A and B, but leak the resources of C
    delete p;
}

what does the C++ standard states if I ever call delete on a pointer to an S ?

它说了以下内容,来自 [class.dtor](N4296 中的§12.4/8):

After executing the body of the destructor and destroying any automatic objects allocated within the body, a destructor for class X calls the destructors for X’s direct non-variant non-static data members, the destructors for X’s direct base classes and, if X is the type of the most derived class (12.6.2), its destructor calls the destructors for X’s virtual base classes.

所以在这种情况下,我们调用 ~S(),然后它将调用 S 的直接基 类 (A) 的析构函数,然后它将依次调用那些基数 类 (O) 的析构函数。

析构函数的 virtual-ness 只会以相反的顺序起作用,即:

O* s = new S;
delete s;

在那种情况下,只有 ~O() 被调用 - 因为没有非静态数据成员,或直接基 类,或虚拟基 类,没有别的做。