使用STL priority_queue时关于内存管理的建议
advice on memory management when using STL priority_queue
我正试图从Java适应C++,当我从STL priority_queue中弹出()项时,我不确定管理内存的正确方法。
我是否应该使用delete来清理从队列中删除的不再需要的项目?如果是,如何?如果没有,为什么不呢?
我给自己写了一个小程序来学习如何使用priority_queue(下面的代码)。在这个程序中,如果内存泄漏也没什么大不了的,因为它的规模很小,结束得很快。但我想学习正确的做事方式,这样我就可以编写一个程序,正确地处理更大的队列,而不会出现内存泄漏。
我不明白的是:top()返回的是引用而不是指针。但我不能对引用使用delete,对吗?
有人能在这里给我指正确的方向吗?
--------------------
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? */
}
}
我应该使用delete来清理从队列中删除的不再需要的项目吗?如果是,如何?如果没有,为什么不呢?
您不需要执行任何清理,因为priority_queue包含PathCost
对象。当它们从队列中删除时,会根据语言规则自动调用它们的析构函数。
在幕后,故事可能会更加复杂。通常,将项目插入priority_queue数据结构将导致该对象的副本的动态分配。但是资源分配和取消分配由底层数据结构(默认情况下为std::vector
)负责,因此您不必担心内存管理。标准库容器和容器适配器据说具有值语义。
我不明白的是:top()返回的是引用而不是指针。但我不能对引用使用delete,对吗?
据说priority_queue
拥有它所拥有的元素,所以如果你引用了它的一个元素,你就无法删除它。事实上,你根本不知道它是否需要删除。此外,尽管您可以访问队列中元素的引用,但不必保留对这些元素的引用。您也可以制作自己的副本:
const PathCost& pRef = tentativeQ.top(); // take constant reference to top element
PathCost p = tentativeQ.top(); // make copy of last element
在第一种情况下,必须小心不要在通过调用pop()
移除顶部元素之后使用该引用。
- 当vector是tje全局变量时,c++中vector的内存管理
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- C++将字符串传递给 C 库以进行内存管理
- 从函数返回时C++内存管理
- 函数指针和 lambda 的内存管理
- 自定义内存管理器在发布模式下工作正常,但在调试模式下则不然
- C++中的内存管理
- C和C++中的内存管理有什么区别
- 字符 * 未从重载运算符或内存管理问题正确返回
- 如何在源代码中使用执行策略检测 C++17 的扩展内存管理算法的可用性?
- 底层指针和内存管理
- 智能指针,避免使用QNetworkAccessManager时进行手动内存管理
- c++中的内存管理问题
- 使用矢量时的内存管理
- 循环和内存管理中的指针算术C++?
- C++堆栈内存管理问题
- C 内存管理中的课程如何管理 - 研究
- 不可变数据模型的内存管理
- C++ 使用数组初始化时的 STL 向量内存管理
- SFML 纹理内存管理