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(),但是这个

  1. SOMETIME 产生上述

    corrupted double-linked list
    
  2. 而在其他情况下(未知因此不受控制的变量)工作正常,

  3. 最后在其他情况下(受控变量;实际上是不同的程序配置)产生

    terminate called after throwing an instance of 'std::runtime_error*'
    

我很乐意至少收到一些关于解决问题方法的提示。由于该程序是强多线程的(我对此知之甚少),我想知道删除指向 MyClass 实例的指针是否会干扰其他东西。

当您从至少 2 个不同的线程调用至少 2 个影响结构的方法时,会导致此类错误。

例如,在 std::map 上调用 clear() 将更改地图本身的结构(删除所有项目)。如果您有另一个线程同时使用该映射(IE。循环它,插入等),那么您将看到您看到的异常。
异常是因为 std::map 结构在您尝试访问它时处于无效状态(地图节点正在改变位置)。

最简单的解决方案是在您访问该地图对象时保持锁定。