指针数据交换的向量和队列:深和浅拷贝

时间:2012-08-21 11:40:48

标签: c++ stl

在我的代码中,我有一个指向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的{​​{1}}对象的内存,从而导致my_vector的元素成为指针?或者,向量是否为my_vector返回的指针所指向的对象的深层或浅层副本?

5 个答案:

答案 0 :(得分:1)

不会删除任何内容。复制/删除/ push_back唯一的东西是指针。这些对象保持活着,只要它们已被动态分配。在这种情况下,您必须自己进行清理。

根据所需的行为,您可能希望使用smart poitners来避免手动内存管理,存储SomeClass个对象而不是指针,或保留原样,并确保在结束。请记住,很难保证程序能够安全地到达释放内存的位置,这是智能指针比动态分配对象的原始指针更受欢迎的原因之一。

答案 1 :(得分:1)

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

强制性评论:考虑使用智能指针而不是原始指针。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

你在任何地方存储指向SomeClass对象的指针,所以没有my_queue.pop()只是从队列中删除指针而你的对象没问题,你将存储一个指向vector的指针副本,而不是深拷贝。