【发布时间】:2012-06-14 06:37:16
【问题描述】:
以下代码创建一个指向B* 的双指针B**。它将使用该指针为另一个指针分配内存,该指针将指向在调用start() 时创建的B 实例:
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;
};
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;
};
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;
}
所以,每当我调用start() 然后再调用~B() 时,都会出现堆栈溢出!
【问题讨论】:
-
第一个问题:你知道
delete是做什么的吗? -
我认为只有在析构函数中调用 exit() 时才会发生递归
-
exit游戏结束。基本上,在它之后没有调用任何东西(嗯,……)。 -
没有。相信我——或者更好,试试看。如果您依赖
exit调用您的析构函数,请为内存泄漏做好准备。
标签: c++ memory-management stack-overflow destructor