当前位置:  开发笔记 > 编程语言 > 正文

使用STL队列pop()销毁类指针

如何解决《使用STL队列pop()销毁类指针》经验,为你挑选了1个好方法。

当您获得一个指针some_queue.front(),将其分配给另一个变量,然后调用时会发生some_queue.pop()什么?谁应该清理内存?(我使用的是c ++ 98,如果确实需要,我可以使用boost智能指针)

例如:(为什么要这样做?还是不应该这样做?)

class SClass {
public:
    SClass(int si): sInt(si){}
    int getSInt(){ return sInt; }

private:
    int sInt;
    ... // bunch of other complicated data types so copy might be slow
};

int main()
{
   cout << "Hello World" << endl; 
   queue sq;
   for(int i = 0; i < 10; i++){
       SClass *sc = new SClass(i);
       sq.push(sc);
   }
   SClass *s2 = NULL;
   while(!sq.empty()){
       s2 = sq.front();
       sq.pop();
       cout << s2->getSInt() << endl;
   }
   delete s2;
   return 0;
}

此处的工作测试代码:http : //cpp.sh/6z7ke



1> YSC..:

在您的情况下,queue仅管理指针本身,它对指向的内存不执行任何操作。在您的示例中,您泄漏了前九个SClass,仅删除了最后一个。

如果您不需要显式需求,则不应动态分配对象。尝试这个:

int main()
{
   cout << "Hello World" << endl; 
   queue 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;
}

在这种情况下,对象在pushed到队列时创建,而在poped 时销毁。如果我们忽略了可能的性能问题(将临时SClass变量作为参数创建queue.push()并复制到队列内部缓冲区;可以对其进行优化,但这是另一个主题),这是一种更简洁易读的方法。


如果您的对象很大,并且您想确保它们不会被无用地复制,则应使用std::queue>或为其提供移动构造函数SClass。这里有点超出范围,所以如果您需要,我让您问另一个问题。

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有