C++11 是什么导致了这段代码中的内存泄漏?
我正在检查可能导致内存泄漏的代码。我知道std::set.erase(这个)和SomeObject的析构函数有问题。那么如何修复它呢C++11 是什么导致了这段代码中的内存泄漏?,c++11,memory-leaks,stl,iterator,C++11,Memory Leaks,Stl,Iterator,我正在检查可能导致内存泄漏的代码。我知道std::set.erase(这个)和SomeObject的析构函数有问题。那么如何修复它呢 class SomeObject; ////.... std::set<SomeObject*> managedObjects; ///..... class SomeObject{ public: SomeObject(){ managedObjects.insert(this); } SomeObject(SomeObject&a
class SomeObject;
////....
std::set<SomeObject*> managedObjects;
///.....
class SomeObject{
public:
SomeObject(){ managedObjects.insert(this); }
SomeObject(SomeObject&& S)/*move cter*/{ managedObjects.insert(this); }
virtual ~SomeObject() { managedObjects.erase(this); }
////....
};
////....
void clearAllObjects() {
for(auto p : managedObjects){
if(p){
delete p;
}
}
managedObjects.clear();
}
////....
class-SomeObject;
////....
std::设置管理对象;
///.....
类对象{
公众:
SomeObject(){managedObjects.insert(this);}
SomeObject(SomeObject&&S)/*移动字符*/{managedObjects.insert(this);}
virtual~SomeObject(){managedObjects.erase(this);}
////....
};
////....
void clearalobjects(){
用于(自动p:managedObjects){
如果(p){
删除p;
}
}
managedObjects.clear();
}
////....
当您删除内部clearAllObjects()
时,它将导致managedObjects.erase(此)
与managedObjects.erase(p)相同
这意味着基于范围的for循环中的内部迭代器可能无效(我不确定)。如果是,它将尝试执行++内部迭代器代码>在无效迭代器上-结果是行为未定义
为了安全起见,您可以复制迭代器,并在执行擦除之前,在集合中将其移动到下一个迭代器
另请注意:无需检查您删除的内容是否为空PTR。如果是这样的话,标准规定它是无效的
例如:
void clearAllObjects() {
for(auto pit = managedObjects.begin(); pit != managedObjects.end();) {
delete *pit++ // postfix ++ returns a copy of the old iterator
}
managedObjects.clear();
}
设置此managedObjects
的一个副作用是,您不能拥有SomeObject
的自动变量
int main() {
SomeObject foo;
clearAllObjects(); // deletes the automatic object "foo" (not allowed)
} // <- the automatic object is destroyed here
intmain(){
someobjectfoo;
clearAllObjects();//删除自动对象“foo”(不允许)
}//clearalobjects
迭代每次迭代时更改的集合。看起来像乌布delete p
->~SomeObject
->managedObjects.erase
请在循环中每次删除时对集合进行@TEDLYGMO SomeObject的析构函数调用erase。可能会引起一些问题。@Pzc是的,你是对的。我错过了那部分。基于范围的for循环的内部迭代器将因擦除而失效。。。。还是内部迭代器真的失效了?感觉可以由基于范围的for-loop来处理。似乎是迭代器的循环范围造成了问题。我被告知,由于调用erase方法后的迭代器无效,循环的范围可能会崩溃。我将尽快对此做进一步的工作。另外,我注意到了副作用,正如你所提到的。非常感谢你的友好回复!当然请原谅我的耽搁,因为我正在创建一个示例来显示效果,然后我提出了另一个问题。再次感谢!