C++ C++;队列在pop后销毁对象?

C++ C++;队列在pop后销毁对象?,c++,C++,首先显示一些简单的代码: A类: //create a queue queue<my_class*> temp; //add some element some pointers; temp.push(A); temp.push(B); ... //then i want to delete the first element ; temp.pop(); //创建一个队列 队列温度; //添加一些元素和指针; 温度推力(A); 温度推动(B); ... //然后我想删除第一

首先显示一些简单的代码:

A类:

//create a queue

queue<my_class*> temp;
//add some element some pointers;

temp.push(A);
temp.push(B);
...

//then i want to delete the first element ;

temp.pop();
//创建一个队列
队列温度;
//添加一些元素和指针;
温度推力(A);
温度推动(B);
...
//然后我想删除第一个元素;
temp.pop();
问题1:当调用temp.pop()时,它将释放所有对象内存 一辆二手车? 如果没有,我该怎么办

B类:

//create a queue

queue<my_class> temp;
//add some element some pointers;

temp.push(A);
temp.push(B);
...

//then i want to delete the first element ;

temp.pop();
//创建一个队列
队列温度;
//添加一些元素和指针;
温度推力(A);
温度推动(B);
...
//然后我想删除第一个元素;
temp.pop();
问题2:A型和B型有什么区别

pop()
确实会破坏第一个元素

但是请注意,在第一种情况下,
std::queue
是裸指针的,销毁裸指针对指向的对象没有任何作用

在第二种情况下,
std::queue
包含对象副本,因此在调用
pop()
时,将销毁并删除第一个副本

在第一种情况下,除非其他人知道被销毁指针指向的对象的地址,并对该地址调用
delete
,否则该对象将“泄漏”(即刚刚被遗忘):它的析构函数将永远不会被调用,它使用的内存将永远不会被回收并用于其他用途

要在第一种情况下销毁指向的对象,通常的过程是

delete queue.front();
queue.pop();
如果使用“智能”指针代替“裸”指针,那么在大多数情况下,“泄漏”问题将消失(*)。请注意,这并不意味着将在
pop()
中调用指向对象的析构函数,而是当其他人不知道指向对象的地址时(如果操作智能指针时所有操作都正确),将在适当的时间调用该析构函数



(*)如果您的数据模型很复杂,并且您拥有相互指向的
std::shared_ptr
对象网络,则存在创建“引用循环”的风险。在这种情况下,即使正确使用
std::shared_ptr
也不足以防止循环泄漏(例如,泄漏对象的cople
a
B
,其中每个对象都有一个
std::shared_ptr
),需要一个真正的垃圾收集器。不幸的是,C++在标准库中不提供这种机制。 > > Q>:<强> >代码> POP<代码>,Type B也做了同样的事情, POP破坏了模板参数中定义的类型(对于A类型,它的指针为“代码> MyOrthyBase<代码>,类型B是“代码> MyObjyAs/Cuth>”)。因此,类型A销毁指针类型B销毁
my_类的实例


Q1:是,因为
A
只是一个指针。但它不会破坏
A
所指向的对象。因此,
my_class
的实例没有发布。

当然,我们应该更喜欢智能指针,而不是手动删除,比如
std::queue
@chtz你能给我一个如何使用std::queue@chtz:我添加了一个关于智能指针的注释。。。它们很好,但重要的是要记住它们不是银弹。C++中唯一的选择是要想拥有所有权(或实现/使用垃圾回收器)。@ 6502 true,按值存储应该始终是第一个选项。只有当这太昂贵(或者存在另一个约束)时,才应该考虑存储(智能)指针。在OP: