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)
标准保证没有.对于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.
| 归档时间: |
|
| 查看次数: |
475 次 |
| 最近记录: |