【问题标题】:Smart Pointer Destructor Race Condition智能指针析构函数竞争条件
【发布时间】:2018-02-02 15:16:54
【问题描述】:

给定下面的析构函数:

~shared_ptr(){
    *_ref_count--;
    if(*_ref_count==0){
        delete _p;
        delete _ref_count;
    }
}

如果

_ref_count == 2

两个线程释放智能指针会导致双重删除(崩溃)和/或根本不删除(内存泄漏)吗?

【问题讨论】:

  • 这是您的代码还是来自 c++ 标准库的摘录?
  • _ref_count 的类型是什么?是atomic吗?
  • 即使_ref_count 是原子的,仍然可能发生双重删除。
  • 是的 - 如果您打算在多线程环境中使用它,就会出现竞争。
  • @patatahooligan:没有

标签: c++ smart-pointers race-condition


【解决方案1】:

简单的答案

是的,存在竞争条件。两个线程可以同时递减和测试。

调查 std::atomic 或包装在互斥锁中或使用 std::shared_ptr (最佳答案)

【讨论】:

  • 这只是一个理论问题。
  • 这只是一个理论上的答案
猜你喜欢
  • 2012-04-17
  • 2011-04-06
  • 2016-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-23
相关资源
最近更新 更多