我已经创建了一个堆栈列表。
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
没有必要吗?
答案 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>*>
该列表不会删除堆栈。它只会删除指针。
顺便说一句,我不建议滥用动态分配内存。它经常导致内存泄漏。