如果我有一个带有自定义删除器的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();
答案 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来解决问题的标准。