关于堆栈列表的内存释放

时间:2014-05-14 19:11:34

标签: 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
delete last;          //LINE2

LINE2会导致unhandled exceptionLINE1会自动解除分配LINE0分配的内存吗? LINE2没有必要吗?

2 个答案:

答案 0 :(得分:1)

要回答您的问题,stacks包含对象,而不是指针,而且没有一个是您使用new创建的。因此,delete last;行是一个错误,因为您提供的地址未从new收到。

此处的关键是stacks.push_back(*st);在列表中存储st指向的对象的副本

另一方面,st确实包含从new表达式接收的指针。你应该做delete st;,否则你会泄漏那段记忆。

手动资源管理可能容易出错并且难以推理,所以我建议您暂时停止使用new,除非并且直到它真的有必要。

答案 1 :(得分:0)

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

C ++容器完全存储设置为参数的数据类型。在这种情况下,列表存储stack<int>,而不是指针或引用它。这意味着容器在push_back运行时创建对象的副本。

如果你想在容器中存储指针,你应该通知编译器:

list<stack<int>*>

该列表不会删除堆栈。它只会删除指针。

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