弱指针是否保证在std::shared_ptr删除程序运行时已过期
Are weak pointers guaranteed to have expired by the time the std::shared_ptr deleter runs?
如果我有一个带有自定义deleter的std::shared_ptr<Foo>
,是否保证所有关联的弱指针都被deleter视为过期?(如果你能引用标准中的相关章节,我将不胜感激。)
换句话说,下面的断言是否保证不会开火?
std::weak_ptr<Foo> weak;
std::shared_ptr<Foo> strong{
new Foo,
[&weak] (Foo* f) {
assert(weak.expired());
delete f;
},
};
weak = strong;
strong.reset();
该标准没有任何保证。对于shared_ptr
的析构函数,规范只说:
- 如果
*this
为空或与另一个shared_ptr
实例共享所有权(use_count()
>1),则没有副作用- 否则,如果
*this
拥有对象p
和删除器d
,则调用d(p)
否则,
*this
拥有一个指针p
,并调用deletep
。[注意:由于
*this
的销毁使与*this共享所有权的实例数量减少了一个,因此在*this
被销毁后,所有与*this
共享所有权的shared_ptr
实例都将报告比其先前值少一个的use_count()
。--结束注释]
reset
的定义是将shared_ptr
交换为临时的,然后将其销毁。
因此,规范只保证在析构函数结束后,use_count
的状态将为零。在该过程中,没有指定将其设置为0的确切时间。
C++14标准中显然没有任何东西可以保证这一点。我现在已经打开了一份包含该问题的标准的缺陷报告。
相关文章:
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 在unique_ptr<>中使用自定义删除程序 (curl_formfree())
- 如何从 CLion 的运行窗口中删除程序项目路径
- shared_ptr的删除程序是否存储在自定义分配器分配的内存中?
- 用于unique_ptr的有状态自定义删除程序
- 为什么unique_ptr不能阻止自定义删除程序的切片?
- std::shared_ptr 在空指针上调用非默认删除程序
- std::unique_ptr 和自定义删除程序
- 如何避免多个删除程序 lambda
- 如何使用lambda和函数作为unique_ptr的自定义删除程序
- std::unique_ptr,自定义删除程序和类型更改
- shared_ptr<EVP_PKEY> EVP_PKEY_free作为自定义删除程序会导致堆损坏
- 使用自定义删除程序返回unique_ptr的 nullptr 失败
- 对 Direct3D11 对象上使用 std::shared_ptr 的自定义删除程序
- 为shared_ptr但遇到错误指定自定义删除程序
- 为什么unique_ptr无法推断出删除程序的类型?
- 删除程序的调用上下文
- unique_ptr、自定义删除程序和零法则
- std::在C++中设置删除程序不起作用
- 带有自定义删除程序错误的 c++ 唯一指针