0

在我的代码中,我有一个指向对象的指针向量SomeClass和一个(自定义比较)基于向量的优先级队列,其中包含指向对象的指针SomeClass

std::vector<SomeClass*> my_vector;
std::priority_queue<SomeClass*, vector<SomeClass*>, CustomCompare> my_queue;

最初my_vector是空的并且my_queue是满的。逐渐my_queue被清空成my_vector这样:

my_vector.push_back(my_queue.top());
my_queue.pop();

我的问题是:是否会my_queue.pop()删除分配给SomeClass被推回的对象的内存,my_vector从而导致元素my_vector成为悬空指针?或者,该向量是对返回的指针指向的对象进行深拷贝还是浅拷贝my_queue.top()

4

5 回答 5

1

不会进行任何删除。唯一被复制/删除/pushed_back 的是指针。这些指向保持活动状态的对象,前提是它们已被动态分配。在这种情况下,您将不得不自己进行清理。

根据所需的行为,您可能希望使用智能指针来避免手动内存管理,存储SomeClass对象而不是指针,或者保持原样并确保在最后进行清理。请记住,很难保证您的程序将安全地到达释放内存的位置,这也是智能指针优于原始指针的原因之一。动态分配的对象。

于 2012-08-21T11:44:08.860 回答
1

my_queue.pop()只会删除存储在队列中的对象;在这种情况下,指针本身,而不是指针指向的对象。所以你在这里很好。

强制说明:考虑使用智能指针而不是原始指针。

于 2012-08-21T11:45:06.160 回答
0

队列和向量都只包含指针。除非您使用智能指针或共享指针,否则队列的析构函数和向量的析构函数都不会释放内存。

于 2012-08-21T11:43:31.617 回答
0

不,因为它们存储指针,它们将复制和销毁指针(这是一个无操作)。没有魔法。unique_ptr如果它们从不同时存储指向同一个对象的指针,那么如果你希望它们最终销毁对象,你可能想要 make then store s 。或者,您可以将实际对象存储在第三个向量 ( vector<SomeClass>) 中,并分别维护向量和指针队列。

于 2012-08-21T11:45:01.217 回答
0

您在任何地方都存储指向 SomeClass 对象的指针,因此没有 my_queue.pop() 只是从队列中删除指针并且您的对象没问题,并且您将存储指向向量的指针的副本,而不是深层副本。

于 2012-08-21T11:47:29.980 回答