当您获得一个指针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; queuesq; 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
在您的情况下,queue
仅管理指针本身,它对指向的内存不执行任何操作。在您的示例中,您泄漏了前九个SClass
,仅删除了最后一个。
如果您不需要显式需求,则不应动态分配对象。尝试这个:
int main() { cout << "Hello World" << endl; queuesq; 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; }
在这种情况下,对象在push
ed到队列时创建,而在pop
ed 时销毁。如果我们忽略了可能的性能问题(将临时SClass
变量作为参数创建queue.push()
并复制到队列内部缓冲区;可以对其进行优化,但这是另一个主题),这是一种更简洁易读的方法。
如果您的对象很大,并且您想确保它们不会被无用地复制,则应使用std::queue
或为其提供移动构造函数SClass
。这里有点超出范围,所以如果您需要,我让您问另一个问题。