假设我有一个类似于下面的类:
#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/