std :: shared_ptr应该如何谨慎处理?

时间:2012-02-02 18:35:58

标签: c++ c++11 shared-ptr

我有点惊讶地发现std::shared_ptr没有提供任何保护(例如,抛出异常)以防止其指向的对象以某种方式被删除。我想这是出于性能原因;假设shared_ptr正在执行其工作,shared_ptr指向的对象应该从未被删除,因此浪费周期不断检查是愚蠢的。

我知道我可以明确检查shared_ptr是否有效,但如果shared_ptr“正在做其工作”以维持对象生命周期,那么每次触摸{{ {1}}。

所以我的问题是,鉴于此,我应该多么谨慎?关于是否,经常或何时应该检查shared_ptr是否有“经验法则”?

到目前为止,我最好的结论是模仿Java:每当你提交一个你没有创建的Java对象的引用时,你应该检查shared_ptr。这对null是一个很好的政策吗?

3 个答案:

答案 0 :(得分:6)

就像任何其他指针一样,如果你有任何理由怀疑它可能包装空指针,请在使用之前检查它。

shared_ptr确实有助于管理它指向的对象的生命周期,但这是一个完全独立的任务,无法确定它是否 指向一个对象。

答案 1 :(得分:4)

  

std::shared_ptr不提供任何保护(例如,抛出异常)以防止其指向的对象以某种方式变为某种情况   空。

C ++语言不识别NULL对象。

如果你的意思是保护对象删除,你可以通过不将智能指针和原始指针混合到同一个对象来绝对防止这种情况。

如果你只有像std::shared_ptr这样的智能指针指向一个对象,你就不必删除该对象,也不会过早删除它。

答案 2 :(得分:2)

作为一种做法,我不使用空指针(或null智能指针)来传达状态,因为它会复杂化是否以及何时应该检查null和complication == bug。因此我从不检查null,我只是使用指针知道它是好的。

我使用空指针的唯一时间是对成员进行延迟初始化(有时在读取某些数据后会生成指针,因此我无法在成员初始化列表中初始化它。)