在我的代码中,我有一个指向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
返回的指针所指向的对象的深层或浅层副本?
答案 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的指针副本,而不是深拷贝。