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)
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容器本身不可复制,因此它作为成员变量的存在将会抑制隐式生成的复制操作.