为什么';t std::shared_ptr取消引用引发空指针异常(或类似异常)? 是C++的一个很大的部分,也是使用它的原因之一(我知道有很多,更重要的,其他的原因)是避免不必要的检查,用大量的混淆代码,如果语句(这可能是一个错误的假设)。

为什么';t std::shared_ptr取消引用引发空指针异常(或类似异常)? 是C++的一个很大的部分,也是使用它的原因之一(我知道有很多,更重要的,其他的原因)是避免不必要的检查,用大量的混淆代码,如果语句(这可能是一个错误的假设)。,c++,exception,C++,Exception,所以现在我很好奇为什么std::shared\u ptr::operator*和std::shared\u ptr::operator->不抛出null\u ptr\u异常或类似的异常?如果每次取消对共享指针的引用都需要检查null ptr并有条件地抛出异常,那么可能会有很多冗余检查,代码膨胀和开销。当然-乐观主义者可能会消除其中一些,但仍然。。。。相反,程序员应该在多次取消引用之前检查一次。我的理解是,智能指针类的外观和行为与原始指针类似。考虑到这一指导性设计原则,理想情况下,遗留代码可以简单

所以现在我很好奇为什么
std::shared\u ptr::operator*
std::shared\u ptr::operator->
不抛出
null\u ptr\u异常
或类似的异常?

如果每次取消对共享指针的引用都需要检查
null ptr
并有条件地抛出异常,那么可能会有很多冗余检查,代码膨胀和开销。当然-乐观主义者可能会消除其中一些,但仍然。。。。相反,程序员应该在多次取消引用之前检查一次。

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

因此,更改取消引用智能指针的行为不应执行任何额外的检查或抛出异常(即,因为原始指针不会以这种方式运行)

向标准中添加智能指针的建议表明了此设计决策():

三、 设计决策

A.一般原则

  • 尽可能接近原始指针,但不接近

  • 谢谢你的回答。我必须承认,标准委员会的理由并不令人满意。如果我们确实用智能指针替换旧代码,那么
    null\u ptr\u异常
    将被取消处理,程序将无论如何中断(就像断言一样,尽管没有解除绑定就被授予了-然后,就像断言一样,此异常可以被调试器打断)@Samaursa对于原始指针取消引用空指针会触发未定义的行为,程序可能看起来运行正常,但我理解您的观点和失望。我不喜欢这种设计。也许我们应该有另一个现代智能指针。但这不是支持/反对异常/错误代码的理由吗?@Samaursa:不。。。允许取消对原始指针或标准库智能指针的引用以生成假定指针永远不会为nullptr的机器代码-该机器代码的运行速度将快于必须检查和避免(对于相同的非nullptr情况)分支到错误处理代码的代码。无论是使用异常代码还是错误代码(它们本身可能在速度和机器代码大小上有所不同)进行处理,不检查/分支都会更快。我希望
    unique\u ptr
    有一个断言和
    shared\u ptr
    (因为它已经是一个相当重的物体,具有参考计数和跟踪能力
    弱\u ptr
    s)抛出。尽管如此,它还是有意义的,因为指针取消引用是一种非常常见的操作。@Samaursa:任何人都可以轻松地将指针包装起来,以在自己的代码中添加检查,但如果它被烘焙,你将永远无法恢复速度。人们还希望能够从原始指针使用迁移到
    unique\ptr
    知道吗ing没有降低性能的风险(好吧,他们可能应该检查一下他们的实现,但在那之后)…为这些更改节省了大量的性能分析。比如说,
    unique\u ptr
    did
    assert
    …任何希望其程序不停止的人都必须检查
    nullptr
    自身并抛出,因此有双重检查。您是否找到了一个智能指针的实现,该实现符合所述要求haviour?@aggsol,不,我们最终使用现有的实现和模板策略创建了自己的