在 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()
被调用 - 因为没有非静态数据成员,或直接基 类,或虚拟基 类,没有别的做。
我有一个 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 forX
’s direct non-variant non-static data members, the destructors forX
’s direct base classes and, ifX
is the type of the most derived class (12.6.2), its destructor calls the destructors forX
’s virtual base classes.
所以在这种情况下,我们调用 ~S()
,然后它将调用 S
的直接基 类 (A
) 的析构函数,然后它将依次调用那些基数 类 (O
) 的析构函数。
析构函数的 virtual
-ness 只会以相反的顺序起作用,即:
O* s = new S;
delete s;
在那种情况下,只有 ~O()
被调用 - 因为没有非静态数据成员,或直接基 类,或虚拟基 类,没有别的做。