c++释放priority_queue中的内存

c++ freeing memory in priority_queue

本文关键字:内存 queue 释放 priority c++      更新时间:2023-10-16

我有一个

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

看起来你会想做一些更像这样的事情:

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

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

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

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

所以你不必担心自己清除记忆。

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

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

最重要的是,你不能强迫它为单个项目释放内存。