我应该在使用它之前检查 boost::shared_ptr 还是 std::shared_ptr

Should I check boost::shared_ptr or std::shared_ptr before I use it?

本文关键字:shared ptr std 还是 boost 检查 我应该      更新时间:2023-10-16
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之前对其进行验证吗?

No.如果在函数的协定中它必须是有效的,那么引起人们对调用者有错误这一事实的最快方法是崩溃。尽早失败。

取决于在正常程序执行期间是否真的有可能shared_ptr为 null。如果没有,请将责任作为先决条件推给f用户,也许assert(ptr);.请注意,它不仅适用于shared_ptr,而且适用于任何指针的使用。尽管您可能应该在此处仅使用引用。

取决于你的方案:

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

如果该函数是私有成员函数或被记录为需要有效指针,那么我将使用 assert .它在发布版本中没有开销,并且可以在调试版本中快速显示问题。

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

是的。 shared_ptr只是为您提供了它知道何时通过计算对它的引用来释放其分配的内存的好处。在使用它之前,您仍然应该验证它是否有效,假设您没有其他方法事先知道它绝对不会为 null,但这与您是否正在使用 shared_ptr 无关

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