我有点惊讶地发现,当指向的对象以某种方式被删除时,std::shared_ptr没有提供任何保护(例如,抛出异常)。我想这是出于性能原因;假设shared_ptr正在执行其工作,shared_ptr所指向的对象应该永远不会被删除,因此浪费不断检查的周期是愚蠢的。
我知道我可以显式地检查shared_ptr是否有效,但是如果shared_ptr是在“做它的工作”来维护对象的生存期,那么每次我接触shared_ptr时显式地检查似乎有点过分了。
因此,我的问题是,鉴于此,我应该保持多大的谨慎?我是否应该检查一次shared_ptr,多久检查一次,或者何时检查一次,有没有一个“经验法则”
到目前为止,我最好的结论是模仿Java语言:任何时候,当您在Java语言中引用一个不是您创建的对象时,都应该检查它的null。这对shared_ptr来说是个好政策吗?
发布于 2012-02-03 02:37:41
就像任何其他指针一样,如果您有任何理由怀疑它可能包装空指针,请在使用它之前检查它。
shared_ptr确实有助于管理它所指向的对象的生命周期,但这与决定它是否指向某个对象是完全不同的任务。
发布于 2012-02-03 02:40:51
当指向的对象以某种方式变为空时,
std::shared_ptr不提供保护(例如,抛出异常)。
C++语言不会识别空对象这样的东西。
如果你的意思是防止对象获得删除的,你可以通过不混合智能指针和原始指针到同一个对象来完全防止这种情况发生。
如果你只有像std::shared_ptr这样的智能指针指向一个对象,你永远不需要删除这个对象,它也不会过早地被删除。
发布于 2012-02-03 02:45:32
作为实践,我不使用空指针(或空智能指针)来传达状态,因为它使您是否以及何时应该检查空和复杂的==错误变得复杂。因此,我从不检查null,我只是使用指针,知道它是好的。
我唯一一次使用空指针是为了延迟成员的初始化(有时一个指针会在读取一些数据后被构造,所以我不能在成员初始化列表中初始化它)。
https://stackoverflow.com/questions/9117941
复制相似问题