Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在stl列表中存储分配的对象_C++_Stl - Fatal编程技术网

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

C++ 在stl列表中存储分配的对象,c++,stl,C++,Stl,我目前正在研究一个四叉树数据结构 我在C++中采用面向对象的方法。我有一个用于四叉树的类,我的类有一个指向名为node的结构的指针,该结构使用new关键字进行分配 该结构包含stl子列表。每次拆分四叉树时,我都会在列表中填充以下内容: node*newnode=新节点 p_node->children.push_back(*newnode)//其中p_node是父节点 因此,由于我使用了新的,我必须释放记忆。 我这样做的方式是沿着树向下横切,清除每个stl列表中的子项,然后删除根。然而valgr

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

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

该结构包含stl子列表。每次拆分四叉树时,我都会在列表中填充以下内容:

node*newnode=新节点

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

因此,由于我使用了新的,我必须释放记忆。
我这样做的方式是沿着树向下横切,清除每个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);