在std :: shared_ptr删除程序运行时,弱指针是否保证已过期?

时间:2016-07-17 23:02:05

标签: c++ c++11 c++14 shared-ptr

如果我有一个带有自定义删除器的std::shared_ptr<Foo>,是否可以保证所有关联的弱指针都被删除器视为已过期? (如果你能引用标准中的相关章节,我将非常感激。)

换句话说,下面的断言保证不会触发?

std::weak_ptr<Foo> weak;
std::shared_ptr<Foo> strong{
  new Foo,
  [&weak] (Foo* f) {
    assert(weak.expired());
    delete f;
  },
};

weak = strong;
strong.reset();

2 个答案:

答案 0 :(得分:8)

标准不保证。对于shared_ptr的析构函数,规范只说:

  
      
  • 如果*this为空或与另一个shared_ptr实例共享所有权(use_count()&gt; 1),则无副作用。
  •   
  • 否则,如果*this拥有对象p和删除者d,则会调用d(p)
  •   
  • 否则,*this拥有指针p,并且会调用删除p

         

    [注意:由于*this的销毁会减少与*一起共享所有权的实例数量,因此在*this销毁所有与{共享所有权的shared_ptr个实例后{1}}会报告比之前值少一个的*this。 - 尾注]

  •   

use_count()的定义是将reset交换成临时的,然后销毁。

因此规范只保证在析构函数完成后shared_ptr的状态为。确切地说,在此过程中它未设置为0。

答案 1 :(得分:2)

C ++ 14标准中显然没有任何内容可以保证这一点。我现在打开了defect report来解决问题的标准。