use*_*800 0 c++ destructor call
在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;
}
Run Code Online (Sandbox Code Playgroud)
~Base()将被召唤,但~Derived()不会.这意味着代码~Derived()不会执行.它可能需要做一些重要的事情.它的EmbeddedObject析构函数也应该被自动调用但不是.因此,EmbeddedObject没有机会释放其动态分配的数据.这会导致内存泄漏.
解决方案,在课堂上制作析构函数Base virtual:
class Base {
public:
virtual ~Base() {
}
};
Run Code Online (Sandbox Code Playgroud)
使这一变化在上述程序是指所有析构函数会被调用这个奥德:Derived::~Derived(),EmbeddedObject::~EmbeddedObject(),Base::~Base()
阅读一般的析构函数.与您提到的其他方案相比,这类问题更容易引起您的关注.例如,在断电的情况下,所有安全清理的赌注通常都会关闭!
在C++中,我们可以很好地控制按照我们希望它们发生的顺序执行析构函数的调用,这是个好消息.但是,在您编写的程序中,如果您不够仔细,则可能会泄露对象并且不会删除.