std :: map <k,v =“”> .clear()在损坏的双链表中崩溃

时间:2015-06-23 11:46:02

标签: c++ multithreading stdmap

所以我得到了变量

std::map<std::string, std::shared_ptr<MyClass>> m_map;

在程序关闭例程期间,我想利用精彩的智能指针 property,这应该(如果我没有错)处理{{1实例,一旦他们自己的最后一个引用被销毁。

所以我只是打电话给MyClass,但是这个

  1. SOMETIME 产生上述

    m_map.clear()
  2. 而在其他情况下(未知因此不受控制的变量)正常工作,

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

    corrupted double-linked list
    
  4. 我很乐意接受至少一些解决问题的方法。由于程序是强多线程的(并且我知之甚少),我想知道删除指向terminate called after throwing an instance of 'std::runtime_error*' 实例的指针是否会干扰其他内容。

1 个答案:

答案 0 :(得分:1)

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

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

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