std::list的pop_back()是否取消内存分配?
Does the pop_back() of std::list de-allocate memory?
我已经创建了一个堆栈列表。
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
相关文章:
- C++:检查动态取消分配是否正常工作
- C++当您取消引用指向类对象的指针,然后将其作为引用返回时,是否可以对此引用调用方法
- boost asio计时器是否会在"取消"时阻塞
- 是否可以删除取消引用的指针
- 统一取消引用语法是否可行?
- 输入迭代器是否可以仅在赋值的右侧符号上取消引用?
- 现代编译器是否可以在使用依赖关系注入时取消虚拟化函数调用
- 取消引用地址时是否可以重定向到其他地址?
- 当取消引用运算符 (*) 重载时,*this 的使用是否受到影响?
- 使用 P/调用传递取消标志时是否需要同步
- boost::instrusive::list 带有自动取消链接钩子:我可以使用列表中的值来确定列表是否只有一个元素
- 在 C++ 中更改越界指针的取消引用是否安全?
- 如何检查给定类型的变量是否可以取消引用
- 是否有某种功能,指针取消给出了rvalue
- 是否避免因变量作用域而取消分配
- 是否存在简单的指向布尔值作为线程取消标志的现实情况,无法有效地取消线程?
- 检查指针是否为null,然后在同一if语句中取消引用它,这样安全吗
- 通过函数指针调用函数 - 是否取消引用指针?有什么区别?
- 取消引用指向不同线程中的原子对象的只读非原子指针是否安全
- 对 std::atomic::load 的结果使用结构取消引用 (->) 运算符是否安全