我应该在使用之前检查boost :: shared_ptr或std :: shared_ptr吗?

q09*_*987 5 c++ boost

void f(boost::shared_ptr<int> ptr)
{
    if (ptr) // should we check?
        // do something
}

void f2(int *p)
{
    if (p) // good practice to check before using it
        // do something
}
Run Code Online (Sandbox Code Playgroud)

问题:我们应该shared_ptr在使用前验证吗?

Pup*_*ppy 5

不.如果它在函数的合同中它必须是有效的,那么最快的方式来引起关注调用者有bug的事实就是崩溃.尽早失败.

  • @ildjarn:"尽早失败" - "断言".:) (2认同)
  • 它对于任何智能或原始指针都是一样的,它与调用者的合同很重要.当你说"可以使用null ptr调用"时,你会检查.如果你说"使用null ptr调用导致UB",那么它会导致UB.选择你的界面. (2认同)

Alm*_*lmo 0

是的。shared_ptr 只是让您通过计算对它的引用来知道何时释放其分配的内存。在使用它之前,您仍然应该验证它是否有效,假设您没有其他方法事先知道它肯定不会为空,但这不属于您是否使用shared_ptr的问题。

  • 虽然这是一个很好的一般建议,但应该注意的是,就像其他指针一样,如果由于某些程序/类不变量而导致指针不能为空,则不需要检查它。例如,如果在构造函数中设置并检查私有成员共享指针,然后不再重新分配,则无需在每个成员函数调用中检查它。 (2认同)