C++ 处理std::shared_ptr时应多谨慎?
我有点惊讶地发现,C++ 处理std::shared_ptr时应多谨慎?,c++,c++11,shared-ptr,C++,C++11,Shared Ptr,我有点惊讶地发现,std::shared_ptr没有提供任何保护(例如,抛出异常),以防其指向的对象以某种方式被删除。我想这是出于性能原因;假设shared_ptr正在执行它的工作,shared_ptr指向的对象永远不应该被删除,因此浪费周期不断地检查是愚蠢的 我知道我可以明确地检查共享的ptr是否有效,但是如果共享的ptr正在“尽其所能”维持对象的生命周期,那么每次我触摸共享的ptr时明确地检查它似乎太过分了 所以我的问题是,考虑到这一点,我应该多谨慎?是否有“经验法则”来确定我是否应该、多久
std::shared_ptr
没有提供任何保护(例如,抛出异常),以防其指向的对象以某种方式被删除。我想这是出于性能原因;假设shared_ptr
正在执行它的工作,shared_ptr
指向的对象永远不应该被删除,因此浪费周期不断地检查是愚蠢的
我知道我可以明确地检查共享的ptr
是否有效,但是如果共享的ptr
正在“尽其所能”维持对象的生命周期,那么每次我触摸共享的ptr
时明确地检查它似乎太过分了
所以我的问题是,考虑到这一点,我应该多谨慎?是否有“经验法则”来确定我是否应该、多久或者何时检查共享\u ptr
到目前为止,我最好的结论是模仿Java:任何时候,当你收到一个Java中没有创建的对象的引用时,你应该检查它是否为
null
。这是否是共享的好策略?就像任何其他指针一样,如果有任何理由怀疑它可能包含空指针,请在使用它之前检查它
shared\u ptr
确实有助于管理它指向的对象的生存期,但这与确定它是否指向对象是完全不同的任务。就像任何其他指针一样,如果您有任何理由怀疑它可能包含空指针,请在使用它之前检查它
shared_ptr
确实有助于管理它指向的对象的生存期,但这与确定它是否指向对象是完全不同的任务
std::shared_ptr
不提供保护(例如,抛出异常),以防其指向的对象以某种方式变为
空
<> P> C++语言不识别空对象。
如果您的意思是防止对象被删除,那么您完全可以通过不将智能指针和原始指针混合到同一个对象来防止对象被删除
如果您只有像std::shared_ptr
这样的智能指针指向对象,那么您永远不必删除该对象,也不会过早地将其删除
std::shared_ptr
不提供保护(例如,抛出异常),以防其指向的对象以某种方式变为
空
<> P> C++语言不识别空对象。
如果您的意思是防止对象被删除,那么您完全可以通过不将智能指针和原始指针混合到同一个对象来防止对象被删除
如果您只有指向对象的智能指针,如
std::shared\u ptr
,那么您永远不必删除该对象,也不会过早地将其删除。作为实践,我不使用空指针(或空智能指针)传递状态,因为它使您是否以及何时应该检查null和complexion==bug变得复杂。因此,我从不检查null,我只是使用指针知道它是好的
我唯一一次使用空指针是为了延迟成员的初始化(有时在读取一些数据后会构造指针,因此我无法在成员初始化列表中初始化它)。作为实践,我不使用空指针(或空智能指针)传递状态,因为它使您是否以及何时应该检查null和complexion==bug变得复杂。因此,我从不检查null,我只是使用指针知道它是好的
我唯一一次使用空指针是为了延迟初始化成员(有时指针会在读取某些数据后构造,因此我无法在成员初始化列表中初始化它).他显然是指当有时指向指向对象的指针不知何故变为空时的
。
@LightnessRacesinOrbit:存储在共享\u ptr
中的指针?当它变为NULL时,它不是定义得很好吗?或者至少定义得很好,但它不会?如果这就是你的意思,我想我的答案解决了这个问题。不是真的。“空指针”定义得很好:它是一个值为0
的指针。对象的取消分配与此无关,这似乎是您的答案所说的。@LightnessRacesinOrbit:空指针定义得很好,我同意。我并不想暗示它不是。他显然是指当有时指向指向指向对象的指针不知何故变为空时,@LightnessRacesinOrbit:shared_ptr
中存储的指针?当它变为NULL时,它不是定义得很好吗?或者至少定义得很好,但它不会?如果这就是你的意思,我想我的答案解决了这个问题。不是真的。“空指针”定义得很好:它是一个值为0
的指针。对象的取消分配与此无关,这似乎是您的答案所说的。@LightnessRacesinOrbit:空指针定义得很好,我同意。我并不想暗示它不是。你不“知道”它是好的。您可能忘记了初始化它,或者您可能不小心让名称隐藏为您提供了一个共享\u ptr
,这可能不是您所认为的。虽然这是断言的内容,我想是的,我应该提到我想。我主张这样的情况。我不会试图错误处理不应该发生的内部代码错误,我只处理来自外部源的错误。啊,assert
很有意义。我最近看到一些愚蠢的代码,在一系列嵌套的if
语句中检查7-8个指针的null
。代码开始接近十几个缩进级别,但它还没有做任何实质性的事情。考虑到这一点,我想知道是否可以通过s自动避免这种丑陋的做法