当您获得一个指针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<SClass *> 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;
}
Run Code Online (Sandbox Code Playgroud)
此处的工作测试代码:http : //cpp.sh/6z7ke
在您的情况下,queue仅管理指针本身,它对指向的内存不执行任何操作。在您的示例中,您泄漏了前九个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;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,对象在pushed到队列时创建,而在poped 时销毁。如果我们忽略了可能的性能问题(将临时SClass变量作为参数创建queue.push()并复制到队列内部缓冲区;可以对其进行优化,但这是另一个主题),这是一种更简洁易读的方法。
如果您的对象很大,并且您想确保它们不会被无用地复制,则应使用std::queue<std::unique_ptr<SClass>>或为其提供移动构造函数SClass。这里有点超出范围,所以如果您需要,我让您问另一个问题。