C++ 使用STL Queue pop()销毁类指针

C++ 使用STL Queue pop()销毁类指针,c++,pointers,C++,Pointers,当您通过some\u queue.front()获取指针,将其分配给另一个变量,然后调用some\u queue.pop(),会发生什么情况?谁应该清理记忆?(我使用的是c++98,如果真的需要,我可以使用boost智能指针) (为什么这样做?还是不应该?) 类SClass{ 公众: SClass(int-si):sInt(si){ int getSInt(){return sInt;} 私人: int sInt; …//一堆其他复杂的数据类型,因此复制可能会很慢 }; int main() {

当您通过
some\u queue.front()
获取指针,将其分配给另一个变量,然后调用
some\u queue.pop()
,会发生什么情况?谁应该清理记忆?(我使用的是c++98,如果真的需要,我可以使用boost智能指针)

(为什么这样做?还是不应该?)

类SClass{
公众:
SClass(int-si):sInt(si){
int getSInt(){return sInt;}
私人:
int sInt;
…//一堆其他复杂的数据类型,因此复制可能会很慢
};
int main()
{

cout在您的例子中,
队列只管理指针本身,它对所指向的内存没有任何作用。在您的示例中,您泄漏了前九个
SClass
,只删除了最后一个

如果不明确需要对象,则不应动态分配对象。请尝试以下操作:

int main()
{
   cout << "Hello World" << endl; 
   queue<SClass> sq;
   for(int i = 0; i < 10; i++){
       sq.push(i);
   }

   while(!sq.empty()){
       SClass& s2 = sq.front();
       cout << s2.getSInt() << endl;
       sq.pop();
   }
   return 0;
}
intmain()
{
库特
当您通过某个_queue.front()获取指针,将其分配给另一个变量,然后调用某个_queue.pop()时会发生什么情况

对象的副本存储在另一个变量中,并从队列顶部移除

谁应该清理记忆

谁分配了内存

为什么这样做有效

快速看一眼,似乎没有任何理由说明它不起作用。但是,您确实泄漏了大部分已分配的
SClass
对象(除底部对象外)。要修复泄漏,请在将队列中的指针重新分配给另一个值(在循环结束时)之前删除它。更好的是,不要手动分配内存,使用对象队列而不是指针队列。

std::queue::pop()
如果包含的元素类型是指针,则不会释放内存。对于所有标准容器,用户必须确保释放原始指针拥有的内存

while(!sq.empty()){
       s2 = sq.front();
       sq.pop();
       cout << s2->getSInt() << endl;

       // memory should be freed here
       delete s2;
   }
while(!sq.empty()){
s2=平方前();
sq.pop();

cout getSInt()必须删除(清理)在这个例子中,你忘了清理9
SClass
。为什么要使用
queue
?为什么不干脆
queue
销毁指针对指针指向的内容没有任何影响。现在,所有容器都只是它们实际类型的容器,它们不在乎类型是否是指针,它们的行为也不一样。这遵循了最小惊喜的原则。Duh!对不起..!这是一个愚蠢的问题:)它应该是
sq.push(i);
还是
sq.push(SClass(i));
sq.push(i);
隐式创建
SClass(i)
推送它。这两种文字在这里是等价的。另外,我不愿意使用对象的原因是它们可能非常大。但我假设在这种情况下,您只使用临时对象,而不是真正的“复制”是这样吗?当它被检索时呢?如果我在
front()
之后调用
pop()
,编译器会优化它吗?
while(!sq.empty()){
       s2 = sq.front();
       sq.pop();
       cout << s2->getSInt() << endl;

       // memory should be freed here
       delete s2;
   }