【问题标题】:Proper use of boost::shared_ptr in a list在列表中正确使用 boost::shared_ptr
【发布时间】:2012-10-20 08:38:02
【问题描述】:

我有一个与 C++ 中的 boost::shared_ptr<> 相关的问题。我目前愿意智能删除列表中的项目:

  • 如果该项目正在使用中,请不要执行任何操作,稍后将其删除
  • 如果该项目未使用,请将其删除

这是我的程序要求的行为。

我真的很想知道如何正确执行此操作,因为 std::list<boost::shared_ptr<object> > 删除/擦除函数会导致删除 shared_ptr<> 并因此删除真实对象。

所以我终于想出了这个解决方案:使用std::list<object*> 并从boost::enable_shared_from_this<> 继承object。这样,当有人需要使用列表中的某个项目时,我会给他们object->shared_from_this()

我的问题如下:

  • 这会尊重预期的行为吗?
  • shared_from_this() 关联的boost::shared_ptr<> 是否考虑到对列表中对象的引用?

我希望我的问题足够明确,并且有人能够帮助我。我希望能够在列表中正确使用智能指针。

谢谢

【问题讨论】:

  • std::list<boost::shared_ptr<object> > remove/erase 函数会导致删除实际对象只有当这是最后一个引用该对象的 shared_ptr 时。这正是你说你想要的。我猜你正在使用 shared_ptr 和指向同一个对象的普通指针。答案很简单,不要那样做,只有 shared_ptrs ,它会按照你说的那样工作。有时我想知道新手是否有能力让自己的生活变得困难。
  • 感谢您的回答。嗯,你说的就是我的想法。我在我的程序中获得了双重释放(这是相当大的)并且valgrind 假设我做错了。我试图在一个小程序中重现它,但不能。我想我像你说的那样是新手。感谢您的帮助

标签: c++ boost shared-ptr


【解决方案1】:

当您删除shared_ptr 时,您不会删除真实对象,除非它没有在其他任何地方使用。这就是使用shared_ptr 的全部意义所在。

例如,如果您从列表中取出一个元素,将其复制并交给另一个函数,然后从列表中删除该元素,则实际对象不会被删除,因为它仍然在其他地方引用。

【讨论】:

  • 我在刚刚制作的一个小程序中得到了正确的行为。正是你解释的。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
相关资源
最近更新 更多