为什么 std::shared_ptr 取消引用不会引发空指针异常(或类似异常)?
Why doesn't std::shared_ptr dereference throw a null pointer exception (or similar)?
异常是C++的重要组成部分,使用它的原因之一(我知道还有很多更重要的其他原因)是为了避免不必要的检查,因为这些检查会用大量的if
语句混淆代码(也许这是一个不正确的假设?)。
所以现在我很好奇为什么std::shared_ptr::operator*
和std::shared_ptr::operator->
不抛出null_ptr_exception
或类似的?
我的理解是,智能指针类的外观和行为都像原始指针。考虑到这一指导性设计原则,理想情况下,遗留代码可以简单地用使用等效所有权语义的智能指针代替原始指针的使用,并且代码将与以前完全一样工作。
因此,更改取消引用智能指针的行为不应该进行任何额外的检查或抛出异常(即,因为原始指针不会这样做)。
在标准中添加智能指针的建议表明了这一设计决定(在图书馆技术报告中添加通用智能指针的提议):
III。设计决策
A。通则
- 尽可能接近原始指针,但没有更接近的指针
如果共享指针的每次取消引用都需要检查nullptr
并有条件地抛出异常,那么可能会有很多冗余检查、代码膨胀和开销。当然,优化器可能会消除其中的一些,但仍然。。。。相反,不管有多少引用,程序员都应该先检查一次。
相关文章:
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 运行时错误:引用绑定到类型为"int"的空指针
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 为什么我在空指针错误(链表)中获取成员访问权限
- 从向量到空指针的 memcpy(反之亦然)不起作用
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 成员访问是否在空指针上定义C++?
- 尝试将对象插入空指针数组时出现分段错误
- 为什么我们需要在 C++ 中检查空指针,而在 Java 中不需要?
- 如何避免自定义 STL 向量类的智能指针 delete[] 异常?
- 异常未手动 - 这是空指针C++
- 启用优化时的堆栈指针比较异常
- 可以通过异常指针"duplicated"异常吗?
- 制作空C++项目:常规异常(来自 HRESULT:0x80131500 的例外)Visual Studio Commun
- 为什么 std::shared_ptr 取消引用不会引发空指针异常(或类似异常)?
- 为什么我的程序没有从取消引用空指针中捕获异常?
- 为什么空指针解引用不是一个异常
- 在JNI对话框生成器调用中出现空指针异常
- 由于图形卡导致空指针异常
- 抛出自定义空指针异常