【问题标题】:Does the pop_back() of std::list de-allocate memory?std::list 的 pop_back() 是否取消分配内存?
【发布时间】:2014-05-15 08:00:57
【问题描述】:

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

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 上的内存吗?我需要 LINE2 吗?

【问题讨论】:

  • 你为什么使用拥有原始指针?使用价值观。或者至少使用std::unique_ptr...
  • 如果模板类删除了指针,它如何接受另一种情况,即压入指向静态变量(非动态)的指针?

标签: c++ c++11


【解决方案1】:

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

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>();

【讨论】:

  • 可以将unique_ptr 放在std::list 中吗? std::list 保证不抄袭吗?
  • @Cramer unique_ptr 是可移动的,list 会根据需要移动元素。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    是的,您确实需要您的LINE2

    stacks.pop_back();
    

    只取消分配它所持有的stack&lt;int&gt;* 所需的内存,而不是实际指向的stack&lt;int&gt; 的内存。

    它实际上无法真正知道,因为您还可以 push_back 指向 stack&lt;int&gt; 的指针并自动存储到其中:

    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?
    

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 如果你有make_unique,那么你不需要任何newdelete,除了placement-new。
      猜你喜欢
      • 2020-09-01
      • 2019-09-06
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 2018-06-01
      • 1970-01-01
      相关资源
      最近更新 更多