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()必须删除(清理)在这个例子中,你忘了清理9SClass
。为什么要使用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;
}