std :: list的pop_back()是否取消分配内存?

时间:2014-05-14 23:52:53

标签: c++ 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

LINE 1是否自动释放在LINE 0分配的内存?我需要LINE2吗?

4 个答案:

答案 0 :(得分:4)

您使用new为堆栈分配了内存,所以是的,您需要手动delete。为了让生活更轻松,请使用list<stack<int>>代替,您不太可能需要指针列表。

list<stack<int>> stacks;
stack<int> st = stack<int>();
stacks.push_back(st);
stacks.back().push(10);   
stack<int> last = stacks.back();
stacks.pop_back();

不再需要为管理内存而烦恼。如果你真的需要一个指针列表,请使用智能指针而不是原始指针。

list<unique_ptr<stack<int>>> stacks;
auto st = unique_ptr(new stack<int>());
stacks.push_back(std::move(st));
stacks.back()->push(10);   
auto last = std::move(stacks.back());
stacks.pop_back();

同样,您无需担心手动释放内存。使用C ++ 14,您还可以摆脱new

auto st = make_unique<int>();

答案 1 :(得分:2)

不,它没有 - 你确实需要LINE2。该列表保证调用其元素的析构函数 - 但它不会调用delete,指针也不具有析构函数。如果您将动态分配的指针插入列表,您仍然有责任清理它。

答案 2 :(得分:2)

是的,您确实需要LINE2

stacks.pop_back();

仅取消分配它所拥有的stack<int>*所需的内存,而不是指向实际stack<int>的内存。

它实际上无法真正知道,因为您还可以push_back指向stack<int>并自动存储的指针,如:

list<stack<int>*> stacks;
stack<int> st;
stacks.push_back(&st);
stacks.pop_back() // how would it know that it's safe to call delete?

在这种情况下尝试取消分配会造成严重破坏,并可能导致分段错误等。

答案 3 :(得分:1)

规则是,如果你有一个new,那么某个地方需要delete,唯一的例外是像std::unique_ptr这样的智能指针。所以在这里,你确实需要LINE2。