<分区>
在 C++ 中,我们喜欢在析构函数中做一些事情。但是在什么样的情况下,析构函数不会被调用呢?
以下情况的例子:
exit()
在线程中调用- 未处理的异常并退出
TerminateProcess()
(在 Windows 中)- 暖/冷重启计算机
- 电脑突然没电了...
标签 c++ call destructor
<分区>
在 C++ 中,我们喜欢在析构函数中做一些事情。但是在什么样的情况下,析构函数不会被调用呢?
以下情况的例子:
exit()
在线程中调用TerminateProcess()
(在 Windows 中)最佳答案
这是每个 C++ 程序员都应该知道的一种情况:
#include <stdio.h>
class EmbeddedObject {
private:
char *pBytes;
public:
EmbeddedObject() {
pBytes = new char[1000];
}
~EmbeddedObject() {
printf("EmbeddedObject::~EmbeddedObject()\n");
delete [] pBytes;
}
};
class Base {
public:
~Base(){
printf("Base::~Base()\n");
}
};
class Derived : public Base {
private:
EmbeddedObject emb;
public:
~Derived() {
printf("Derived::~Derived()\n");
}
};
int main (int argc, const char * argv[])
{
Derived *pd = new Derived();
// later for some good reason, point to it using Base pointer
Base* pb = pd;
delete pb;
}
~Base()
将被调用,但 ~Derived()
不会。这意味着 ~Derived()
中的代码不会执行。它可能必须做一些重要的事情。此外,EmbeddedObject
的析构函数本应自动调用,但并未自动调用。因此,EmbeddedObject
没有机会释放其动态分配的数据。这会导致内存泄漏。
解决方案,在Base
类virtual
中构造析构函数:
class Base {
public:
virtual ~Base() {
}
};
对上述程序进行这一更改意味着所有析构函数都将按以下顺序调用:Derived::~Derived()
、EmbeddedObject::~EmbeddedObject()
, Base::~Base()
阅读一般的析构函数。与您提到的其他情况相比,这些问题更可能是您关心的问题。例如,在断电的情况下,安全清理的所有赌注通常都会落空!
在 C++ 中,我们可以很好地控制按照我们希望的顺序执行析构函数的调用,这是个好消息。然而,在您编写的程序中,如果您不够小心,您的对象有可能被泄露并且根本没有被删除。
关于c++ - 在什么情况下,c++的析构函数不会被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8733894/