如何释放成员的所有派生动态内存?

时间:2016-06-18 11:14:43

标签: c++

说我有课:

struct foo{
    foo* bar=nullptr;
};

现在,如果我使用new来分配像链一样的内存:

foo instance;
instance.bar= new foo;
instance.bar->bar=new foo;
...

那么如何在一次调用中删除instance的所有子项以删除顶级instance,即当我调用destroy(instance); //dummy name时,所有这些动态分配的内存都被释放?

3 个答案:

答案 0 :(得分:4)

您可能习惯了std :: unique_ptr(或std :: shared_ptr,如果需要):

#include <memory>
struct foo{
    std::unique_ptr<foo> bar;
};

int main() {
    // Please do not use '_' as a variable name.
    // (Some people do: #define _(T) gettext(T) // for gnu gettext support)
    foo _;
    _.bar = std::make_unique<foo>();
    _.bar->bar = std::make_unique<foo>();
    // ... the destructor will deallocate.
}

但是,假设foo有一个数据成员(结构)T,您可以考虑单个链表:

#include <forward_list>
std::forward_list<T> foo_list;

导致相关问题,例如:Remove all nodes in linked list

答案 1 :(得分:0)

首先,您应该正确定义问题。

  1. 复制foo是什么意思?一切都会被深深地解决吗?
  2. 这种类型可以移动吗?
  3. 孩子foo可以在没有父母的情况下生活吗?
  4. 我将采用一般情况并根据它回答您的问题:

    1. 复制是一份很深的副本。
    2. 可动。
    3. 这是基于约束的解决方案:

      struct foo{
          foo()=default;
          foo(foo const& other){
              bar=new foo(*other.bar);
          }
          foo(foo&& other){
              bar=other.bar;
              other.bar=nullptr;
          }
          ~foo(){
              delete bar;
          }
          foo* bar=nullptr;
      };
      

答案 2 :(得分:-1)

在struct foo中添加析构函数。

struct foo{
    foo* bar=nullptr;
    ~foo() {delete bar;}
};

当foo的实例超出范围时,将调用析构函数并删除bar。