c++ - 编译器如何处理派生析构函数中的基类析构函数调用?

标签 c++ virtual-destructor

出于好奇,我尝试做类似下面示例的操作,看看编译器是否给我警告,而不是调用一个最终导致堆栈溢出的无限循环。我想也许有一种不同于仅仅调用普通函数或方法的行为。但事实并非如此。对此是否有特殊解释,或者它只是作为普通函数调用处理,因为我通过使用 this 运算符明确调用基类析构函数?

例子:

class A {
  virtual ~A();
};

class B : A {
  virtual ~B() { this->~A(); }
};

最佳答案

@M.M的评论中了。您正在两次调用析构函数。这是未定义的行为,任何事情都可能发生,包括您观察到的行为。

(实际上,这些析构函数调用中的一个很可能会修改对象的 vptr,这意味着后续的析构函数调用不再转到最派生的对象。但这只是一个猜测。)

正确的做法是不要手动调用析构函数。

关于c++ - 编译器如何处理派生析构函数中的基类析构函数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42392128/

相关文章:

C++ 转换为更精确的类型并失去准确性?

C++ 清除结构 vector 异常

c++ - 为什么当派生类的析构函数是非虚函数时基类析构函数调用派生对象?

c++ - 如何在派生对象数组上使用析构函数?

c++ - 为什么带有花括号初始化器列表的构造函数/虚拟析构函数不起作用?

c++ - 为什么 std::nullopt_t 是 C++ 标准的一部分?

c++ - 预处理器忽略

c++ - 如何在模板类中拆分模板友元函数的定义?

c++ - 虚拟析构函数 - 谁调用底层的 free()?

c++ - 没有虚函数,还需要虚析构函数?