【发布时间】:2016-11-20 11:17:55
【问题描述】:
如果我有一个带有自定义删除器的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();
【问题讨论】:
-
那么在调用删除器之前,使用计数器将为零,this
expiredreference 表示它“相当于use_count() == 0”。参考不权威,需要通过规范才能找到确定的答案(C++11、C++14、C++17标准的草案都是免费的,批准前的最后一个草案就好了够了)。 -
同意。但标准的明确答案正是我所要求的。 :-) 我还没有找到适合自己的。
-
我认为这是隐含的:如果您的断言不正确,那么您可以用
weak.lock()替换它(并且可能将所有权移出),然后共享对象的析构函数将是运行两次。 -
@KerrekSB:你怎么能“暗示”这样的事情?规范定义了行为,如果规范没有明确定义 this 的行为,那么它是未定义的。哦,我认为规范的 intent 很明显是在销毁对象之前递减计数器。但如果意图和措辞不一致,那就是缺陷。
标签: c++ c++11 c++14 shared-ptr