C++11 是什么导致了这段代码中的内存泄漏?

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

我正在检查可能导致内存泄漏的代码。我知道std::set.erase(这个)和SomeObject的析构函数有问题。那么如何修复它呢

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方法后的迭代器无效,循环的范围可能会崩溃。我将尽快对此做进一步的工作。另外,我注意到了副作用,正如你所提到的。非常感谢你的友好回复!当然请原谅我的耽搁,因为我正在创建一个示例来显示效果,然后我提出了另一个问题。再次感谢!