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 次 |
最近记录: |