我有一个
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;
}
答案 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)删除旧的向量空间。
底线是你不能强迫它释放单个物品的记忆。