我已经创建了一个堆栈列表。
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吗?
答案 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。