关于堆栈列表的内存释放



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

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是不必要的吗?

回答您的问题,stacks包含对象,而不是指针,并且它们都不是您使用new创建的。所以delete last;行是一个错误,因为你给它的地址不是从new接收的。

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

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

手动资源管理可能容易出错,很难推理,所以我建议你停止使用new,除非真的有必要。

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

c++容器准确地存储了作为参数设置的数据类型。在这种情况下,list存储stack<int>,而不是指向它的指针或引用。这意味着当push_back运行时,容器创建对象的副本。

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

list<stack<int>*>

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

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

最新更新