我已经创建了一个堆栈列表。
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
LINE2
将引起unhandled exception
。LINE1
会自动释放在LINE0
分配的内存吗?LINE2
是不必要的吗?
回答您的问题,stacks
包含对象,而不是指针,并且它们都不是您使用new
创建的。所以delete last;
行是一个错误,因为你给它的地址不是从new
接收的。
stacks.push_back(*st);
在列表中存储了st
所指向对象的副本。
另一方面,st
确实包含一个从new
表达式接收的指针。你应该做一个delete st;
,否则你会泄漏内存。
手动资源管理可能容易出错,很难推理,所以我建议你停止使用new
,除非真的有必要。
是,容器会自动删除存储对象。
c++容器准确地存储了作为参数设置的数据类型。在这种情况下,list存储stack<int>
,而不是指向它的指针或引用。这意味着当push_back
运行时,容器创建对象的副本。
如果你想在容器中存储指针,你应该通知编译器:
list<stack<int>*>
该列表不会删除堆栈。它只会删除指针。
顺便说一下,我不建议滥用动态分配内存。这通常会导致内存泄漏。