【问题标题】:Deleting content of a boost::shared_ptr删除 boost::shared_ptr 的内容
【发布时间】:2012-12-14 09:50:28
【问题描述】:

我对@9​​87654322@ 有疑问。

我在析构函数中看到了这一点(ptr 是 boost::shared_ptr): ptr = boost::shared_ptr< int >( new int ).

这样好吗?不应该是ptr.reset(),就像这里所说的:How to intentionally delete a boost::shared_ptr?

干杯!

【问题讨论】:

  • 您有疑问吗?在有疑问的地方,让我播种信念:没关系。
  • 嗨,神圣的先知!为什么这比致电reset() 更好?还是口味问题?谢谢!。
  • 不是更好,而是更糟。当然,除非您确实想使用新的 int。
  • 好的!!。谢谢!。如何将其发布为答案以便我接受? :)
  • @AdriC.S.:不是更好,但也不是不正确。智能指针类(或 any 健全的库代码)的要点是,您不能通过使用其正常接口来破坏任何东西。智能指针的分配非常好(尽管reset 更清晰、更直接)。

标签: c++ shared-ptr


【解决方案1】:

这取决于你以后想用 ptr 做什么。

如果您需要重新分配它以指向一个新值,那么代码就是这样做的。如果您需要明确地使其无效,那么reset() 就是这样做的。如果它是一个将被析构函数隐式销毁的类成员,那么可能不需要做任何事情,除非你有一些奇怪的销毁顺序要求。

没有更多的上下文,不可能说哪个是正确的。

更新: 因为你说这实际上不是在析构函数中,而是一个旨在使对象处于奇怪的半破坏状态的成员函数,这取决于如何指定这种奇怪的状态。如果它需要一个空指针,则重置它;如果它需要一个有效的指针,但不需要指向以前共享的任何内容,则重新分配它。更好的是,完全消除这种状态,为对象提供更强的有效性保证。

【讨论】:

  • 嗨!好吧,就我所见,共享指针在类中使用。因此,当该类的实例被销毁时,共享指针就会消失,因为每个实例都有自己的共享指针。新的 int 行用于名为 finalize 的方法中,该方法在对象被销毁时调用。 – Adri C.S. 4 秒前
  • @AdriC.S.:所以你有一个成员函数,旨在将对象置于某种奇怪的不死状态,与析构函数分开?在这种情况下,只有设计该类的疯子才能说出该功能的后置条件应该是什么。在理智的设计中,破坏将由析构函数处理,您无需执行任何明确的操作即可释放 shared_ptr 成员。
  • 是的,finalize 函数“清除”共享指针并删除类中使用的其他普通指针。析构函数已声明...但为空:~ThatClass::ThatClass(){}.
  • @AdriC.S.:如果它真的是为了“清除”对象而不实际破坏它,那么你确实想要reset()
  • @AdriC.S.:当对象被销毁时,不需要对shared_ptr成员做任何明确的事情;它们将被自己的析构函数隐式释放。您只需要删除您使用原始指针管理的任何内容 - 您根本不应该这样做。
【解决方案2】:

ptr = boost::shared_ptr< int >( new int ) 将通过在其析构函数中调用boost::shared_ptr 构造函数...将内部值与您不想使用的新 int 交换。

ptr.reset() 将内部值交换为空,最好在您链接的帖子中提到

【讨论】:

    猜你喜欢
    • 2013-09-24
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多