使用析构函数删除成员向量中的堆分配对象

时间:2017-05-04 18:52:05

标签: c++ class memory-management memory-leaks destructor

我有一个递归问题,我试图解决。如果可以执行给定操作,则可能存在其他子操作,等等。我的解决方案就是这样一个类:

// MyObj.h
#include <vector>
class MyObj
{
    private:
        std::vector<MyObj*> _children;
    public:
        void addChild(MyObj* m);
}

// MyObj.cpp
#include "MyObj.h"
void MyObj::addChild(MyObj* m)
{
    MyObj::_children.push_back(m);
}

我正在使用这样的课程:

MyObj m;
MyObj *child = new MyObj();
m.addChild(child);

我的理解是,因为我在堆上分配了child,所以我需要在以后销毁它。如果创建该对象的代码没有维护该引用,那么它将取决于父对象以销毁它。是否适合定义这样的析构函数:

MyObj::~MyObj()
{
    for (std::size_t i = 0; i < MyObj::_children.size(); i++)
    {
        delete MyObj::_children[i];
    }
}

我是否在正确的轨道上,或者我的方法是否有缺陷?

PS:如果这是一个直接复制,我道歉,因为我知道有许多问题已经涉及析构函数;我看了一堆,但仍然没有自信。我对C ++缺乏经验,并认为直接的问题对我有用。

1 个答案:

答案 0 :(得分:1)

除非绝对必要,否则不应使用new。一旦这样做,您有责任释放动态分配的内存。在上面的代码中:

MyObj m;
MyObj *child = new MyObj();
m.addChild(child);

一旦函数超出范围,mchild将调用它们的析构函数,因为它们不是动态分配的,因此会破坏它们。

但是,child指针指向的内容以与mchild类似的方式销毁,因为它是在newdelete中动态分配的通过only免费存储。在这种情况下,您需要为您在免费商店中放置的每个对象调用@media screen and (max-width: 1180px) .element { display: none !important; } } ,就像您在上面做的那样。

这就是为什么在评论中人们建议您使用智能指针,因为它们遵循RAII范例,在这种情况下,一旦它们超出范围,对象将自动被释放。