Jon*_*nas 1 c++ stack-overflow destructor memory-management
下面的代码创建一个双指针B**的B*.它将使用该指针为另一个指针分配内存,该指针将指向被调用B时创建的实例start():
class A:
class A
{
public:
A()
{
fb = new B*;
*fb = NULL;
}
~A()
{
if(*fb)
delete *fb;
delete fb;
}
B** getfb()
{
return fb;
}
private:
B** fb;
};
Run Code Online (Sandbox Code Playgroud)
class B:
class B
{
public:
B()
{
B** fb = a->getfb();
*fb = this;
}
~B()
{
B** fb = a->getfb();
delete *fb; // <--- stack overflow
*fb = NULL;
}
private:
A* a;
};
Run Code Online (Sandbox Code Playgroud)
start()(成员函数class C):
void C::start()
{
B** fb = a->getfb(); // 'a' is a pointer to an 'A' instance
if(*fb == NULL)
B* f = new B;
}
Run Code Online (Sandbox Code Playgroud)
所以,每当我打电话start()然后打电话~B(),我都会发现堆栈溢出!
听起来不错.
该类型fb是B**这样的类型*fb是B*.
因此,当你说delete *fb你正在调用析构函数时,class B这是一个递归调用,它没有向基本情况发展,因此堆栈溢出.
在B()你分配*fb = this;然后:
~B()
{
...
delete *fb; // delete this;
...
}
Run Code Online (Sandbox Code Playgroud)
..相当于一次又一次地delete this;在析构函数内部调用~B(),因此由于递归函数过多而导致stackoveflow.
这是一个很好的线程,是否安全delete this.