您的列表必须存储对象,而不是指针(从您在调用 push_back() 时遵循 newnode 这一事实可以看出):
list<node> p_node;
当您push_back() 时,您正在存储源对象的副本,因此您必须使用new 分配您分配的原始对象delete,否则它将被泄露:
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_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);
list<shared_ptr<node>> p_node;
...
auto newnode = make_shared<node>();
p_node.push_back(newnode);