C++中的递归析构函数

Eri*_*ric 0 c++ destructor memory-leaks

假设我有一个类似于以下的类:

#include <vector>

class element
{
public:
   element();
   ~element();

   virtual void my_func();

private:
   std::vector<element*> _elements;
};
Run Code Online (Sandbox Code Playgroud)

我将如何实现析构函数?

我在想这样的事,但我不确定.我担心内存泄漏,因为我对C++比较陌生.

void element::destroy()
{
   for(int i = 0; i < _elements.size(); ++i)
      _elements.at(i)->destroy();

   if(this != NULL) 
      delete this;
}

element::~element()
{
    destroy();
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

PS:这是一个主要的示例:

int main()
{
   element* el_1 = new element();
   element* el_2 = new element();
   element* el_3 = new element();

   el_1.add_element(el_2);
   el_2.add_element(el_3);

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

另外,如果我这样做(又名不使用new):

int main()
{
   element el_1;
   element el_2;
   element el_3;

   el_1.add_element(&el_2);
   el_2.add_element(&el_3);

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 8

element::~element()
{
    typedef std::vector<element*>::const_iterator iterator;
    for (iterator it(_elements.begin()); it != _elements.end(); ++it)
        delete *it;
}
Run Code Online (Sandbox Code Playgroud)

delete this在析构函数中总是错误的: this已经被破坏了!

此外,您需要声明一个复制构造函数和复制赋值运算符(将它们保留为未定义,使您的类不可复制,或提供复制树的合适定义).

或者(最好),你应该使用一个智能指针容器_elements.例如,

std::vector<std::unique_ptr<element>> _elements;
Run Code Online (Sandbox Code Playgroud)

当一个element被销毁时,它的_elements容器将被自动销毁.当容器被销毁时,它将销毁其每个元素.A std::unique_ptr拥有它指向的对象,当它std::unique_ptr被销毁时,它将破坏它指向的元素.

通过std::vector<std::unique_ptr<element>>在这里使用,您不需要提供自己的析构函数,因为所有这些内置功能都会为您进行清理.

如果您希望能够复制element树,则仍需要提供自己的复制构造函数和克隆树的复制赋值运算符.但是,如果您不需要树可复制,则不需要像自己管理内存那样声明复制操作:std::unique_ptr容器本身不可复制,因此它作为成员变量的存在将会抑制隐式生成的复制操作.