gpt4 book ai didi

c++ - 执行 "delete this"时缺少虚拟析构函数

转载 作者:太空狗 更新时间:2023-10-29 19:46:47 28 4
gpt4 key购买 nike

16.15 of the C++ FAQ Lite讨论 delete this 然后提到:

Naturally the usual caveats apply in cases where your this pointer is a pointer to a base class when you don't have a virtual destructor.

为什么是这样?考虑这段代码:

class ISuicidal {
public:
virtual void suicide() = 0;
};

class MyKlass : public ISuicidal {
public:
MyKlass() {
cerr << "MyKlass constructor\n";
}

~MyKlass() {
cerr << "MyKlass destructor\n";
}

void suicide() {
delete this;
}
};

这样使用:

int main()
{
ISuicidal* p = new MyKlass;
p->suicide();
return 0;
}

在调用 p->suicide() 时,MyKlass 的析构函数按预期被调用,即使 ISuicidal 具有没有虚拟析构函数

对我来说这是有道理的,因为在 MyKlass::suicide 中,this 的静态类型已知为 MyKlass*,所以正确的析构函数被调用。这很容易通过将 typeid 调用放在 suicide 中来验证。

那么是FAQ条目不准确,还是我误解了?

最佳答案

你误会了。在ISuicidal中实现自杀函数(即delete this),你会发现当this指针是基类时调用delete并不会调用派生类的析构函数。

关于c++ - 执行 "delete this"时缺少虚拟析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7440727/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com