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

时间:2012-03-15 20:46:01

标签: 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
}

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

5 个答案:

答案 0 :(得分:5)

没有。如果它在函数的契约中它必须是有效的,那么引起注意调用者有错误这一事实的最快方法就是崩溃。尽早失败。

答案 1 :(得分:3)

取决于在正常程序执行期间实际上是否有shared_ptr为空的可能性。如果没有,请将责任作为fassert(ptr);用户的先决条件。请注意,它不仅适用于shared_ptr,而且任何指针都可以使用。虽然你可能只想在这里使用引用。

答案 2 :(得分:2)

取决于您的方案:

如果f()是公共功能/ API函数,您无法控制某人可能通过的内容,那么您应该检查。

如果函数是私有成员函数或记录为需要有效指针,那么我将使用assert。它在发布版本中没有任何开销,并且很快就会在调试版本中显示出来。

 void f( shared_ptr<T> ptr)
 {
    assert( ptr && "ptr is null!" );

    .....
 }

答案 3 :(得分:0)

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

答案 4 :(得分:0)

假设:如果您的void foo(shared_ptr<int> ptr)是通用库,并且您希望在运行时通知用户nullptr值不受支持(抛出异常),或者使用不同的代码路径处理它是的,检查它是正确的。如果您不需要将shared_ptr存储在foo()的某处,并且您只需确保该函数不支持空指针,则只需传递引用,例如void foo(int &integer)。对于我所知道的编译器,引用大多数时候是非可空指针(通常取决于优化选择)。