C++11 标准决策"shared_ptr(const weak_ptr<Y>& r) Throws bad_weak_ptr"
C++11 standard decision "shared_ptr(const weak_ptr<Y>& r) Throws bad_weak_ptr"
怎么了(真正的问题在其后引用后用粗体显示)
§20.7.2.2.1
template<class Y> explicit shared_ptr(const weak_ptr<Y>& r);
23要求:Y*
应可转换为T*
。24效果:构造一个与r共享所有权的shared_ptr对象,并存储存储在r中的指针副本。
25后置条件:use_count() == r.use_count()
26投掷:bad_weak_ptr
时为r.expired()
27异常安全:如果抛出异常,构造函数将无效
这不是助推行为。由过期的弱构造的共享给出了空的共享。你可以在布尔上下文中测试它。
为什么委员会选择了例外的方式?例如,谷歌C++准则完全排除了异常使用。有这样的指导原则,甚至在构建时禁用异常(在授权禁用的编译器上)的项目将如何处理?
最后,如果这种情况经常发生(开发人员将过期指针检测作为正常程序流),那么它的速度是否会非常慢(对于实时程序)?我记得有一篇文章提到了实现异常的两种可能策略,一种是减慢一切速度,但当异常发生时并不是真的,另一种是只有当异常发生后才减慢速度,但不会影响其他策略。我认为在某种程度上这一定仍然成立。
我忽略了整个异常,purrformance&谷歌指南咆哮,因为这太愚蠢了,除非你有一个用例可以证明这会伤害你。
如果您不想处理异常,请将其构造为
shared_ptr<T> p{r.lock()};
如果r.expired() == true
shared_ptr
相关文章:
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 为什么"weak.lock()"返回"nullptr" "auto weak=std::make_shared<int>(42);"的定义?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- C++中的指针否定 (!ptr == NULL)
- 从const ptr*转换为ptr*时出现问题
- 这是MSVC 2013中具有共享PTR的单例的正确实现吗?
- 对唯一 ptr 无效读取的引用向量
- C++ 类型转换基础 PTR 到派生 PTR 保存在引用类中
- 为什么使用模板生成的函数具有"weak"符号类型?