【发布时间】: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