2012-03-15 103 views

回答

0

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

+2

虽然这是很好的一般性建议,但应该注意的是,就像其他指针一样,如果指针由于某些程序/类不变而不能为空,则不需要检查它。例如,如果在构造函数中设置并检查了私有成员共享指针,然后不再重新分配,则不需要在每个成员函数调用中检查它。 – 2012-03-15 20:53:08

+0

安德烈是对的。 – Almo 2012-03-15 20:54:21

+0

@André:或者应该在'assert'中检查。 – ildjarn 2012-03-15 20:55:04

5

不会。如果它在函数的合约中必须有效,那么关注调用者有bug的最快方法是崩溃。尽可能早地失败。

+0

这个问题在技术上只会导致UB;不能保证一个_observable_错误,无论是崩溃。 – ildjarn 2012-03-15 20:54:34

+2

@ildjarn:“尽早失败” - 'assert'。 :) – Xeo 2012-03-15 20:57:30

+0

+1,因为这正是我所做的。典型的聪明的东西,你不会听到由无能,非程序员教授运行的大学编程课程。 – ceztko 2012-03-15 21:12:10

3

取决于在正常程序执行过程中shared_ptr为空是否确实存在。如果不是,请将责任推向fassert(ptr);的用户。请注意,它不仅适用于shared_ptr,而且真正使用任何指针。虽然你也许应该在这里使用引用。

+0

我特别没有通过提供带参考参数b/c的函数来列出问题,我们假设参考不应指向空指针,而且我们始终不需要检查参考。但是,你仍然可以使它无效。 – q0987 2012-03-15 20:56:34

2

取决于您的方案:

如果f()是,你必须对什么人可以与你擦肩而过然后是你应该检查无法控制的公共功能/ API函数。

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

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

    ..... 
} 
+1

不喜欢断言用于验证运行时值,因为在调试和发布中获得不同的行为。应该为应用程序不变量保留断言,而不是运行时检查。 – 2012-03-15 21:01:53

0

让我们说:如果你的void foo(shared_ptr<int> ptr)是一个通用库,你想在运行时,该nullptr值是不支持的(抛出一个异常),或者与不同的代码路径是处理通知用户,这是正确的检查它。如果您不需要在您的foo()某处存储shared_ptr,并且您只需确保该函数不会支持空指针,则只需传递一个引用,例如void foo(int &integer)。对于我知道的编译器,引用是大多数时间不可为空的指针(通常取决于优化选项)。