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

jac*_*bsa 7 c++ shared-ptr c++11 c++14

如果我有一个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();
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 8

标准保证没有.对于shared_ptr析构函数,规范只说:

  • 如果*this为空或与另一个shared_ptr实例共享所有权(use_count()> 1),则没有副作用.
  • 否则,如果*this拥有一个对象p和一个删除器d,d(p)则被调用.
  • 否则,*this拥有一个指针p,并p调用delete .

    [注意:由于销毁会*this减少与*一起共享所有权的实例数量,在*this销毁之后,所有shared_ptr共享所有权的实例*this将报告use_count()比之前的值少一个的实例. - 尾注]

并且reset定义为将a交换shared_ptr为临时的,然后销毁.

因此规范只保证析构函数完成状态use_count为零.确切地说,在该过程中它未设置为0.

  • 谢谢,我现在提交了一份缺陷报告. (2认同)

jac*_*bsa 2

显然 C++14 标准中没有任何内容可以保证这一点。我现在已经打开了涵盖该问题的标准的缺陷报告。