在stl列表中存储已分配的对象

时间:2014-07-26 11:47:27

标签: c++ stl

我目前正在研究四叉树数据结构。

我在C ++中采用面向对象的方法。我有一个四叉树的类,我的类有一个指向结构的指针,该结构使用new关键字进行分配。

该struct包含一个stl list children。每次我分割我的四叉树时,我都会填充我的列表:

node * newnode =新节点。

p_node-> children.push_back(* newnode)//其中p_node是父节点

因此,由于我使用了新的,我必须释放内存。 我这样做的方式是我在树上横向移动并清除每个stl列表中的子项,然后我删除了根。然而valgrind告诉我,我有内存泄漏。我想知道是否有人可以解释如何释放动态分配并存储在stl列表中的数据。

2 个答案:

答案 0 :(得分:0)

我在这里看到一系列问题

1)为什么你想要新的'指针而不是传递对象?

之类的东西
Node n;
parent_node.push_back(n); // Copy or move constructor here

2)为什么,你为什么要裸指针?!?不要这样做!如果您需要指针语义,请使用智能指针并管理您的资源。

auto n = make_shared<Node>();
parent_node.push_back(n);

BTW为什么或如何将节点作为指针而将parent_node作为值/引用?

使用这个星期六进行一些研究,我建议GotW #89或者如果因为任何原因你不能使用C ++ 11使用boost Boost

答案 1 :(得分:0)

您的列表必须存储对象,而不是指针(在调用newnode时您正在引用push_back()这一事实就明白了):

list<node> p_node;

当您push_back()存储源对象的副本时,您必须delete使用new分配的原始对象,否则它将被泄露:

node *newnode = new node;
p_node.push_back(*newnode); // <-- makes a copy
delete node; // <-- must free original

可以简化为:

node newnode;
p_node.push_back(newnode);

甚至:

p_node.push_back(node());

话虽这么说,如果你想在你的列表中存储指针,你必须这样做:

list<node*> p_node;
...
node *newnode = new node;
p_node.push_back(newnode);

然后在完成使用后遍历p_node删除对象:

for (list<node*>::iterator i = p_node.begin(); i != p_node.end(); ++i)
    delete *i;
p_node.clear();

如果您使用的是C ++ 11,则可以使用std::unique_ptrstd::shared_ptr而不是裸指针,因为两者都是容器安全的(不像std::auto_ptr,不是)。让STL为您管理内存,完成节点后不需要遍历:

list<unique_ptr<node>> p_node;
...
unique_ptr<node> newnode(new node);
p_node.push_back(newnode);

list<shared_ptr<node>> p_node;
...
auto newnode = make_shared<node>();
p_node.push_back(newnode);