出于好奇,我尝试做类似下面示例的操作,看看编译器是否给我警告,而不是调用一个最终导致堆栈溢出的无限循环。我想也许有一种不同于仅仅调用普通函数或方法的行为。但事实并非如此。对此是否有特殊解释,或者它只是作为普通函数调用处理,因为我通过使用 this
运算符明确调用基类析构函数?
例子:
class A {
virtual ~A();
};
class B : A {
virtual ~B() { this->~A(); }
};
最佳答案
@M.M的评论中了。您正在两次调用析构函数。这是未定义的行为,任何事情都可能发生,包括您观察到的行为。
(实际上,这些析构函数调用中的一个很可能会修改对象的 vptr,这意味着后续的析构函数调用不再转到最派生的对象。但这只是一个猜测。)
正确的做法是不要手动调用析构函数。
关于c++ - 编译器如何处理派生析构函数中的基类析构函数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42392128/