次のコードは、への double ポインター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;
};
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()
、スタック オーバーフローが発生します。