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
吗?
答案 0 :(得分:5)
没有。如果它在函数的契约中它必须是有效的,那么引起注意调用者有错误这一事实的最快方法就是崩溃。尽早失败。
答案 1 :(得分:3)
取决于在正常程序执行期间实际上是否有shared_ptr
为空的可能性。如果没有,请将责任作为f
和assert(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)
。对于我所知道的编译器,引用大多数时候是非可空指针(通常取决于优化选择)。