C++ 在stl列表中存储分配的对象
我目前正在研究一个四叉树数据结构 <>我在C++中采用面向对象的方法。我有一个用于四叉树的类,我的类有一个指向名为node的结构的指针,该结构使用new关键字进行分配 该结构包含stl子列表。每次拆分四叉树时,我都会在列表中填充以下内容: node*newnode=新节点 p_node->children.push_back(*newnode)//其中p_node是父节点 因此,由于我使用了新的,我必须释放记忆。C++ 在stl列表中存储分配的对象,c++,stl,C++,Stl,我目前正在研究一个四叉树数据结构 我在C++中采用面向对象的方法。我有一个用于四叉树的类,我的类有一个指向名为node的结构的指针,该结构使用new关键字进行分配 该结构包含stl子列表。每次拆分四叉树时,我都会在列表中填充以下内容: node*newnode=新节点 p_node->children.push_back(*newnode)//其中p_node是父节点 因此,由于我使用了新的,我必须释放记忆。 我这样做的方式是沿着树向下横切,清除每个stl列表中的子项,然后删除根。然而valgr
我这样做的方式是沿着树向下横切,清除每个stl列表中的子项,然后删除根。然而valgrind告诉我我有内存泄漏。我想知道是否有人可以解释如何释放动态分配并存储在stl列表中的数据 我在这里看到了一系列问题 1) 为什么要“新建”指针而不是传递对象? 差不多
Node n;
parent_node.push_back(n); // Copy or move constructor here
2) 为什么,为什么你想要裸体指针?!?别这样!如果您需要指针语义,请使用智能指针并管理您的资源
auto n = make_shared<Node>();
parent_node.push_back(n);
auto n=make_shared();
父节点。推回(n);
顺便问一下,为什么或者如何将节点作为指针,而将父节点作为值/引用
使用本周六进行一些研究,我建议,或者如果出于任何原因您不能使用C++11,请使用boost您的列表必须存储对象,而不是指针(在调用
push_back()
时延迟newnode
),这一点很明显:
可简化为:
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);
如果您使用的是C++11,则可以使用std::unique_ptr
或std::shared_ptr
而不是裸指针,因为两者都是容器安全的(不像std::auto_ptr
,后者不是)。让STL为您管理内存,完成节点后无需遍历:
list<unique_ptr<node>> p_node;
...
unique_ptr<node> newnode(new node);
p_node.push_back(newnode);
列表p_节点;
...
唯一\u ptr newnode(新节点);
p_节点。推回(newnode);
列表p_节点;
...
自动新建节点=使_共享();
p_节点。推回(newnode);
非常感谢。这为我澄清了很多事情。对不起,我把我的描述写错了。我的结构称为节点。在我的结构中有一个名为children的列表。因此,我保留了结构向下连接的节点列表。
list<node*> p_node;
...
node *newnode = new node;
p_node.push_back(newnode);
for (list<node*>::iterator i = p_node.begin(); i != p_node.end(); ++i)
delete *i;
p_node.clear();
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);