c++ - 如何告诉析构函数没有被调用?

标签 c++ c++11

<分区>

我刚刚有个面试题,面试官问

How to tell the destructor is not called when it should have be called?

And what will you do if the destructor is not called?

老实说,我不知道答案。我的猜测是将析构函数放在 try catch block 中,但我从未见过有人这样做。有更好的解决方案吗?

最佳答案

对象的析构函数调用失败有多种方式:

  • 调用abort_exit(即使是exit 也不会破坏堆栈变量)。
  • 让构造函数抛出异常。 (从技术上讲,如果构造函数抛出异常,则该对象永远不会存在,因此不存在可调用其析构函数的对象)。
  • 调用未定义的行为(此时 C++ 标准允许任何发生)。在用 new [] 分配的数组上调用 delete 是调用未定义行为的一种方式,一个常见的行为是只调用第一个对象的析构函数(留下第二个和随后未破坏) - 但它仍然是未定义的行为。
  • 另一种调用未定义行为的方法很可能使析构函数不被调用,即使用指向基的指针,它实际上指向派生对象,并在指向基的指针上调用 delete。如果基类没有虚拟析构函数,则您有未定义的行为。
  • 您还没有在分配给 new 的指针上调用 delete(如果您有内存泄漏,这尤其成问题)。 (这实际上是一个特别常见的“析构函数不应该被运行”的情况)。

如果你正在尝试调试一个程序并想知道是否正在调用析构函数,那么

  • 设置断点并在调试器下运行
  • printf 或您正在使用的任何日志记录框架。

关于c++ - 如何告诉析构函数没有被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34232236/

相关文章:

c++ - Hexfloat 机械手和精度

c++ - 抑制 wxFileName::Normalize 错误消息

c++ - 在 std::thread 中使用共享指针

c++ - std::array<char, N> 的大小是多少?

使用 lambda 的 c++11 排序列表

c++ - 在 QToolBar 中移动 QMenuBar

c++ - 如何在纹理映射过程后合并两个 .obj 文件?

c++ - volatile POD 类型的容器

c++ - 使用初始化列表构造时如何避免创建(和删除)临时对象?

c++ - 用于将 weak_ptr 应用于 unique_ptr 的内容