从析构函数中调用delete会导致堆栈溢出吗?

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(),我都会发现堆栈溢出!

Ray*_*oal 7

听起来不错.

该类型fbB**这样的类型*fbB*.

因此,当你说delete *fb你正在调用析构函数时,class B这是一个递归调用,它没有向基本情况发展,因此堆栈溢出.


iam*_*ind 6

B()你分配*fb = this;然后:

~B()
{
  ...
  delete *fb; // delete this;
  ...
}
Run Code Online (Sandbox Code Playgroud)

..相当于一次又一次地delete this;在析构函数内部调用~B(),因此由于递归函数过多而导致stackoveflow.

这是一个很好的线程,是否安全delete this.