C++11 关于堆栈列表的内存释放

C++11 关于堆栈列表的内存释放,c++11,C++11,我已经创建了一个堆栈列表 using namespace std; list<stack<int>> stacks; stack<int> *st = new stack<int>(); //LINE0 stacks.push_back(*st); st->push(10); stack<int> *last = &stacks.back(); stacks.pop_back(); //LINE1 d

我已经创建了一个堆栈列表

using namespace std;
list<stack<int>> stacks;
stack<int> *st = new stack<int>();      //LINE0
stacks.push_back(*st);
st->push(10);   
stack<int> *last = &stacks.back();
stacks.pop_back();    //LINE1
delete last;          //LINE2
使用名称空间std;
列表堆栈;
stack*st=新堆栈()//第0行
堆叠。向后推压(*st);
st->push(10);
stack*last=&stacks.back();
stacks.pop_back()//第1行
最后删除//第2行

LINE2
将导致
未处理的异常
LINE1
是否会自动解除分配在
LINE0
上分配的内存?
LINE2
是否不必要?

是,容器会自动删除存储的对象

C++容器准确地存储设置为参数的数据类型。在这种情况下,列表存储的是堆栈,而不是指向堆栈的指针或引用。这意味着容器在运行
push_back
时创建对象的副本

若要在容器中存储指针,应通知编译器:

list<stack<int>*>
列表
该列表不会删除堆栈。它将只删除指针


顺便说一下,我不建议滥用动态分配内存。它通常会导致内存泄漏。

为了回答您的问题,
堆栈
包含对象,而不是指针,并且它们都不是由您使用
new
创建的。因此,行<代码>最后删除是一个错误,因为您给它的地址不是从
new
收到的

这里的关键是
stacks.push_back(*st)
在列表中存储由
st
指向的对象的副本

另一方面,
st
确实包含从
new
表达式接收的指针。你应该做一个
deletest否则您将泄漏该内存


手动资源管理很容易出错,也很难解释,因此我建议您停止使用
new
,除非确实有必要这样做。

list stacks=new list()——这不是你在C++中创建栈列表的方式。您不需要
new
,除非您需要指向某个对象的指针,而不仅仅是对象本身。如果你想要一个堆栈列表,那就是
列表堆栈。没有理由在此代码中使用
new
。C++不是java,停止使用<代码>新< /C>。行
堆叠。向后推(*st)
取消引用指针并将该对象的副本存储到
堆栈中,
st
现在指向不同的对象。
最后删除
尝试删除未使用
new
创建的对象。您需要删除并停止使用
new
。如果我使用list,list会删除指针本身吗?我不需要删除指针?例如:列表堆栈;stack*st=新堆栈()//第0行堆栈。推回(st);st->push(10);stack*last=stacks.back();stacks.pop_back()//第1行删除最后一行//第二行。我需要用“删除最后一个”来释放内存吗?@John:你需要停一下,了解一下
堆栈的内容。向后推(*st)正在执行。哦,停止使用
new
(这样你就不需要首先使用
delete
堆叠。向后推(st),是否需要
删除st?或者将
stacks.pop_back()自动释放内存?@John:那不会编译,因为
堆栈
保存对象,而你不能将指针向后推。只需将其声明为
stack st并且当它超出范围时将自动销毁。无需
新建
删除
。当您执行
pop_back()
@John:Eeek时,
堆栈中的元素也将自动清理,您可能需要更新此问题或使用实际代码发布新问题。这与最初发布的内容相比变化太大了。