2012-10-20 38 views
2

我在C++中有一个与boost::shared_ptr<>有关的问题。我现在愿意履行我的列表项的智能删除:如果该项目不在使用在列表中正确使用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<>是否考虑了对列表中对象的引用?

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

谢谢

+2

'std :: list >删除/擦除功能会导致删除真实对象*仅当它是最后一次引用对象*的shared_ptr时。这正是你说你想要的。我猜你正在使用shared_ptr和普通指针指向同一个对象。答案很简单,不要那样做,只有shared_ptrs,它会按照你所说的要求工作。有时我想知道新手为自己生活困难的能力。 – john

+0

感谢您的回答。那么,你说的是我的想法。在我的程序中,我得到了两倍的免费(这是相当大的),并认为我错误地认为是“valgrind”。我试图在一个小程序中重现它,但不能。我想我是你说的新手。感谢您的帮助 – Rippalka

回答

4

当你删除一个shared_ptr你不删除的真正对象,除非它不使用其他任何地方。这就是关于使用shared_ptr的关键。例如,如果您将列表中的一个元素复制并将其赋予另一个函数,然后从列表中删除该元素,则该实际对象将不会被删除,因为它仍然在其他地方被引用。

+0

我在我刚刚制作的一个小程序中获得了正确的行为。确切地说,你解释了什么。谢谢 – Rippalka

+0

很高兴帮助! – alestanis

相关问题