std::map<K, V>.clear() 在损坏的双链表中崩溃
std::map<K, V>.clear() crashes in corrupted double-linked list
所以我得到了变量
std::map<std::string, std::shared_ptr<MyClass>> m_map;
在程序关闭例程中,我想利用美妙的 智能指针 property 它应该(如果我没记错的话)处理销毁 MyClass
个实例,一旦它们自己的最后一个引用被销毁。
所以我只是打电话给 m_map.clear()
,但是这个
SOMETIME 产生上述
corrupted double-linked list
而在其他情况下(未知因此不受控制的变量)工作正常,
最后在其他情况下(受控变量;实际上是不同的程序配置)产生
terminate called after throwing an instance of 'std::runtime_error*'
我很乐意至少收到一些关于解决问题方法的提示。由于该程序是强多线程的(我对此知之甚少),我想知道删除指向 MyClass
实例的指针是否会干扰其他东西。
当您从至少 2 个不同的线程调用至少 2 个影响结构的方法时,会导致此类错误。
例如,在 std::map 上调用 clear() 将更改地图本身的结构(删除所有项目)。如果您有另一个线程同时使用该映射(IE。循环它,插入等),那么您将看到您看到的异常。
异常是因为 std::map 结构在您尝试访问它时处于无效状态(地图节点正在改变位置)。
最简单的解决方案是在您访问该地图对象时保持锁定。
所以我得到了变量
std::map<std::string, std::shared_ptr<MyClass>> m_map;
在程序关闭例程中,我想利用美妙的 智能指针 property 它应该(如果我没记错的话)处理销毁 MyClass
个实例,一旦它们自己的最后一个引用被销毁。
所以我只是打电话给 m_map.clear()
,但是这个
SOMETIME 产生上述
corrupted double-linked list
而在其他情况下(未知因此不受控制的变量)工作正常,
最后在其他情况下(受控变量;实际上是不同的程序配置)产生
terminate called after throwing an instance of 'std::runtime_error*'
我很乐意至少收到一些关于解决问题方法的提示。由于该程序是强多线程的(我对此知之甚少),我想知道删除指向 MyClass
实例的指针是否会干扰其他东西。
当您从至少 2 个不同的线程调用至少 2 个影响结构的方法时,会导致此类错误。
例如,在 std::map 上调用 clear() 将更改地图本身的结构(删除所有项目)。如果您有另一个线程同时使用该映射(IE。循环它,插入等),那么您将看到您看到的异常。
异常是因为 std::map 结构在您尝试访问它时处于无效状态(地图节点正在改变位置)。
最简单的解决方案是在您访问该地图对象时保持锁定。