【问题标题】:c++ freeing memory in priority_queuec ++释放priority_queue中的内存
【发布时间】:2016-09-07 06:29:10
【问题描述】:

我有一个

priority_queue<node*, std::vector<node*>, CompareNodes> heap;

假设节点包括:

class node {
public:
    int value;
    int key;
    int order = 1000000;
};  

完成优先队列后如何释放内存? 我的方法似乎不起作用:

while (heap.top()) {

        node * t = heap.top();
        heap.pop();
        delete t;
    }

【问题讨论】:

  • 什么告诉你它不起作用?此外,如果没有 NULL 元素,这似乎总是会抛出。
  • 将问题描述为“似乎不起作用”是没有帮助的。 究竟出了什么问题?
  • 请发帖minimal reproducible example(stackoverflow.com/help/mcve)。
  • @DavidSchwartz 我的意思是程序触发断点并关闭
  • 您的代码中没有任何内容表明您必须释放任何内存。最好发minimal reproducible example

标签: c++ pointers memory-leaks free


【解决方案1】:

看起来你想要做更多这样的事情:

while (!heap.empty())
{ /* the rest ... */ }

如果堆是空的,.top() 将抛出异常,因为没有什么可以返回,当你弹出元素时会发生这种情况。

另外,如果可以的话,你应该使用

priority_queue<std::unique_ptr<node>, std::vector<std::unique_ptr<node>>, CompareNodes> heap;

因此您不必担心自己清除内存。

【讨论】:

    【解决方案2】:

    就像大多数 std:: 容器一样,内存可能会或可能不会在您想要的时候被释放。内存通常会保留更长的时间,因此当您执行 heap.push 或等效操作时,不需要再次分配内存。

    想想 std::vector 每次增长时都必须为整个向量分配一组新的内存(向量数据在内存中必须是连续的)。 std::vector 执行大的一次性分配并保留内存以使增长操作不会影响性能会更有效——a)分配足够大的新空间,b)将现有向量的全部内容复制到新的向量空间,c) 删除旧的向量空间。

    底线是您不能强制它为单个项目释放内存。

    【讨论】:

    • 他使用的是std::vector&lt;node*&gt;而不是std::vector&lt;node&gt;
    • std::vector 仍然要求所有指针的所有内存单元在内存中是连续的。 std::vector 的示例仍然适用于 std::priority_queue,因为他无法释放 std::priority_queue 分配的内存。
    • 是的,但他不是要删除指针,而是要删除它们指向的内容。
    • 我将问题解释为“如何释放 std::priority_queue 分配的内存”。不是我如何释放节点内存,因为他的代码调用了该内存的删除。
    • @Russ 抱歉,我的意思是释放节点分配的内存
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2011-12-27
    相关资源
    最近更新 更多