为什么 std::shared_ptr 取消引用不会引发空指针异常(或类似异常)?

Why doesn't std::shared_ptr dereference throw a null pointer exception (or similar)?

本文关键字:空指针异常 异常 shared std ptr 取消 为什么 引用      更新时间:2023-10-16

异常是C++的重要组成部分,使用它的原因之一(我知道还有很多更重要的其他原因)是为了避免不必要的检查,因为这些检查会用大量的if语句混淆代码(也许这是一个不正确的假设?)。

所以现在我很好奇为什么std::shared_ptr::operator*std::shared_ptr::operator->不抛出null_ptr_exception或类似的?

我的理解是,智能指针类的外观和行为都像原始指针。考虑到这一指导性设计原则,理想情况下,遗留代码可以简单地用使用等效所有权语义的智能指针代替原始指针的使用,并且代码将与以前完全一样工作。

因此,更改取消引用智能指针的行为不应该进行任何额外的检查或抛出异常(即,因为原始指针不会这样做)。

在标准中添加智能指针的建议表明了这一设计决定(在图书馆技术报告中添加通用智能指针的提议):

III。设计决策

A。通则

  1. 尽可能接近原始指针,但没有更接近的指针

如果共享指针的每次取消引用都需要检查nullptr并有条件地抛出异常,那么可能会有很多冗余检查、代码膨胀和开销。当然,优化器可能会消除其中的一些,但仍然。。。。相反,不管有多少引用,程序员都应该先检查一次。