面试官问道,我刚接到面试问题
应该如何告诉析构函数何时应该被调用?
如果没有调用析构函数,你会怎么做?
说实话,我不知道答案.我的猜测是将析构函数放在一个try catch
块中,但我从未见过人们这样做.有更好的解决方案吗?
有许多方法可以无法调用对象的析构函数:
调用abort
或_exit
(甚至exit
会使堆栈变量不受影响).
让构造函数抛出异常.(从技术上讲,如果构造函数抛出,对象永远不会存在,所以没有一个对象可以调用它的析构函数).
调用未定义的行为(此时C++标准允许任何事情发生).调用delete
分配的数组new []
是一种调用未定义行为的方法,一种常见的行为是仅调用第一个对象的析构函数(留下第二个和后续不受欢迎的行为) - 但它仍然是未定义的行为.
另一种调用未定义行为的方法是,一种很可能让析构函数无法调用的方法是使用指向基类的指针实际指向派生对象,并在指向基类的指针上调用delete.如果基类没有虚析构函数,则表明存在未定义的行为.
你还没有调用delete
分配的指针new
(如果你有内存泄漏,这尤其有问题).(这实际上是"析构函数不应该已经运行"的一个特别常见的情况).
如果您正在尝试调试程序并想要查明是否正在调用析构函数,那么
设置一个断点并在调试器下运行
printf或您正在使用的任何日志框架.