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

Does the pop_back() of std::list de-allocate memory?

本文关键字:取消 是否 内存 分配 back list pop std      更新时间:2023-10-16

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

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

LINE1是否自动清除LINE0分配的内存?我需要2号线吗?

您使用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>();

是的,你确实需要你的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?

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

不,它不需要——你需要LINE2。列表保证调用其元素的析构函数,但它不调用delete,指针也没有析构函数。如果你将一个动态分配的指针插入到列表中,你仍然要负责清理它。

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