gpt4 book ai didi

c++ - 使用STL priority_queue时内存管理的建议

转载 作者:行者123 更新时间:2023-11-30 04:24:16 25 4
gpt4 key购买 nike

我正在尝试从 Java 适应 C++,但不确定在从 STL priority_queue 中 pop() 一个项目时管理内存的正确方法。

我是否应该使用 delete 来清理从队列中删除的不再需要的项目?如果是这样,如何?如果不是,为什么不呢?

我自己编写了一个小程序来学习如何使用 priority_queue(代码如下)。在这个程序中,即使有内存泄漏也没什么大不了的,因为它规模很小,而且很快就会结束。但我想学习正确的做事方式,这样我就可以编写一个程序来正确处理更大的队列而不会出现内存泄漏。

我不明白的是:top() 返回一个引用而不是一个指针。但是我不能对引用使用删除,可以吗?

有人能给我指出正确的方向吗?

--------------------

struct PathCost{
int dest;
int cost;
PathCost(int _dest, int _cost){
dest = _dest;
cost = _cost;
}
bool operator<(PathCost other) const;
bool operator>(PathCost other) const;
};

bool PathCost::operator<(PathCost other) const{
return cost < other.cost;
}
bool PathCost::operator>(PathCost other) const{
return cost > other.cost;
}


int main(){

PathCost pc = PathCost(1, 2);
pc = PathCost(3, 4);
PathCost* pcp = new PathCost(5, 6);
delete pcp;

priority_queue<PathCost,
vector<PathCost>,
greater<vector<PathCost>::value_type> > tentativeQ;

cout << "loading priority queue ...\n";
tentativeQ.push(PathCost(8, 88));
tentativeQ.push(PathCost(5, 55));
tentativeQ.push(PathCost(7, 77));
tentativeQ.push(PathCost(4, 44));

cout << "\nlist items on queue in priority order ...\n";
while (!tentativeQ.empty()){
pc = tentativeQ.top();
cout << "dest:" << pc.dest << " cost:" << pc.cost << endl;
tentativeQ.pop();
/* DO I NEED TO DO MEMORY CLEANUP AT THIS POINT? */
}
}

最佳答案

Am I supposed to use delete to clean up items removed from the queue that I no longer need? If so, how? If not, why not?

您不需要执行任何清理,因为 priority_queue 持有 PathCost 对象。当它们从队列中移除时,根据语言规则自动调用它们的析构函数。

在幕后,故事可能要复杂一些。将一个项目插入 priority_queue 数据结构通常会导致动态分配该对象的拷贝。但是资源分配和取消分配由底层数据结构(默认 std::vector )负责,因此您不必担心内存管理。据说标准库容器和容器适配器具有值语义

The thing I do not understand is this: top() returns a reference rather than a pointer. But I can't use delete on a reference, can I?

priority_queue据说拥有它拥有的元素,所以如果你引用它的元素之一,你就不能删除它。事实上,您根本不知道是否需要删除它。此外,虽然您可以访问队列中元素的引用,但您不必保留对这些元素的引用。您也可以制作自己的拷贝:

const PathCost& pRef = tentativeQ.top(); // take constant reference to top element
PathCost p = tentativeQ.top(); // make copy of last element

在第一种情况下,您必须注意不要在通过调用 pop() 移除顶部元素后使用该引用。

关于c++ - 使用STL priority_queue时内存管理的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12880527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com