【问题标题】:std::map<K, V>.clear() crashes in corrupted double-linked liststd::map<K, V>.clear() 在损坏的双链表中崩溃
【发布时间】:2015-06-23 11:46:02
【问题描述】:

所以我得到了变量

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 实例的指针是否会干扰其他事情。

【问题讨论】:

  • 您是否尝试过使用 valgrind 或 gdb 来分析您的代码?
  • 如果没有看到您的“有时”、“其他情况”和“其他情况”,我们无法知道问题出在哪里。
  • 您不应该将新的智能指针视为自动删除指针,而是从所有权的角度来看。资源一次可以只有一个所有者吗?然后使用std::unique_ptr。一个资源可以同时拥有多个所有者吗?然后使用std::shared_ptr。
  • 一个基本但重要的问题:正如您所写,它是多线程的;所以你在做同步,对吧?

标签: c++ multithreading stdmap


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-25
    • 2019-07-30
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多