说我有课:
struct foo{
foo* bar=nullptr;
};
现在,如果我使用new来分配像链一样的内存:
foo instance;
instance.bar= new foo;
instance.bar->bar=new foo;
...
那么如何在一次调用中删除instance
的所有子项以删除顶级instance
,即当我调用destroy(instance); //dummy name
时,所有这些动态分配的内存都被释放?
答案 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)
首先,您应该正确定义问题。
我将采用一般情况并根据它回答您的问题:
这是基于约束的解决方案:
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。