【发布时间】:2012-02-03 16:55:48
【问题描述】:
假设我有一个类似于以下的类:
#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();
}
谢谢。
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;
}
另外,如果我这样做(也就是不要使用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;
}
【问题讨论】:
-
您可以调用
delete _elements.at(i),并且您不应该在析构函数中测试this不为空。不能为空。 -
会调用
delete _elements.at(i)正确处理所有子元素吗?换句话说,它们会以正确的顺序(自下而上)处理吗?因为我认为如果我删除了一个element,它的_elements中仍然有东西,那将是一个泄漏。 -
当你
delete something;something的类的析构函数被调用,然后指针被释放。 -
您应该尽可能避免使用原始指针。在这种情况下:确保您确实需要一个指针向量(通常仅在
element是抽象基类或不可复制时才需要),如果是这样,则首选ptr_vector。 -
@Philipp:在这种情况下,需要一个指针容器:标准库容器不能用不完整的类型实例化,因此
element不能有std::vector<element>作为成员。 (或者,可以使用第三方容器库。Boost 的容器库对实例化的要求不那么严格。)
标签: c++ memory-leaks destructor