c++ - C++ 中的递归析构函数

标签 c++ memory-leaks destructor

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

#include <vector>

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

   virtual void my_func();

private:
   std::vector<element*> _elements;
};

我将如何着手实现析构函数?

我在想这样的事情,但我不确定。我很担心内存泄漏,因为我是 C++ 的新手。

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

   if(this != NULL) 
      delete this;
}

element::~element()
{
    destroy();
}

谢谢。

附言: 这是一个示例 main:

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;
}

此外,如果我这样做(也就是不使用 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;
}

最佳答案

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

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

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

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

std::vector<std::unique_ptr<element>> _elements;

element被摧毁,它的_elements容器将自动销毁。当容器被销毁时,它会销毁它的每个元素。 std::unique_ptr拥有它指向的对象,并且当std::unique_ptr被销毁时,它会销毁它指向的元素。

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

如果你想复制一个element树,您仍然需要提供自己的复制构造函数和复制赋值运算符来克隆树。然而,如果你不需要树是可复制的,你不需要像你自己管理内存那样声明复制操作:std::unique_ptr容器本身是不可复制的,因此它作为成员变量的存在将抑制隐式生成的复制操作。

关于c++ - C++ 中的递归析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8749753/

相关文章:

c++ - 为什么我需要手动删除 vector 中的指针?

C++语法混淆——声明unsigned char数组

c++ - 如何传递 std::string 作为构造函数参数并将其保存的 C 字符串存储在 void 指针中?

java - 让与服务器的连接始终打开

C# - 属性中的 new 可能导致内存泄漏

c++ - 显式调用基类析构函数/构造函数是否合法?

c++ - 使用 -1 初始化结构或数组的无符号 {} 初始化

c++ - 我如何在 C++ 中将 bitset 转换为 short?

.net - DebugDiag 分析超时问题

java - 如何清理 Java 中打开的进程?