c ++释放priority_queue中的内存

时间:2016-05-11 17:35:03

标签: c++ pointers memory-leaks free

我有一个

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;
    }

2 个答案:

答案 0 :(得分:3)

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

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

如果堆为空,.top()将抛出异常,因为没有什么可以返回,这将在弹出元素时发生。

此外,如果可用,您应该使用

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

所以你不必担心自己清理内存。

答案 1 :(得分:0)

就像大多数std :: containers一样,内存可能会被释放,也可能不会被释放。内存通常保持较长时间,以便在执行heap.push或等效操作时,不需要再次分配内存。

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

底线是你不能强迫它释放单个物品的记忆。