C++ C++;队列在pop后销毁对象?
首先显示一些简单的代码: A类: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); ... //然后我想删除第一
//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
也不足以防止循环泄漏(例如,泄漏对象的coplea
和B
,其中每个对象都有一个std::shared_ptr
),需要一个真正的垃圾收集器。不幸的是,C++在标准库中不提供这种机制。> > > Q>:<强> >代码> POP<代码>,Type B也做了同样的事情,my_类的实例
Q1:是,因为A
只是一个指针。但它不会破坏A
所指向的对象。因此,my_class
的实例没有发布。当然,我们应该更喜欢智能指针,而不是手动删除,比如std::queue
@chtz你能给我一个如何使用std::queue@chtz:我添加了一个关于智能指针的注释。。。它们很好,但重要的是要记住它们不是银弹。C++中唯一的选择是要想拥有所有权(或实现/使用垃圾回收器)。@ 6502 true,按值存储应该始终是第一个选项。只有当这太昂贵(或者存在另一个约束)时,才应该考虑存储(智能)指针。在OP: