std::map<K, V>.clear() 在损坏的双链表中崩溃

std::map<K, V>.clear() crashes in corrupted double-linked list

本文关键字:损坏 链表 崩溃 gt lt map clear std      更新时间:2023-10-16

所以我得到了变量

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

在程序关闭例程期间,我想利用奇妙的智能指针属性,一旦MyClass实例自己的最后一个引用被销毁,它应该(如果我没错的话(负责销毁它们。

所以我只是打电话给m_map.clear(),但是这个

  1. 有时产生上述

    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 结构时,它处于无效状态(映射节点正在更改位置(。

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