如何故意删除boost :: shared_ptr?

时间:2009-03-07 03:15:00

标签: c++ memory-management boost shared-ptr

我有很多boost::shared_ptr<MyClass>个对象,在某些时候我故意想delete其中一些对象释放一些记忆。 (我知道那时我将永远不再需要指向MyClass个对象了。)我怎么能这样做?

我猜你不能只用我delete()带来的原始指针调用get()

我在get_deleter(shared_ptr<T> const & p)中看到了一个函数boost::shared_ptr,但我不确定如何使用它,并且它旁边还有 experimental 。 (我想我有1.38升。)

也许只是为变量分配一个新的空boost::shared_ptr?这应该扔掉旧值并删除它。

4 个答案:

答案 0 :(得分:82)

你刚才

ptr.reset();

请参阅shared_ptr manual。它相当于

shared_ptr<T>().swap(ptr)

你在每个不应该引用该对象的智能指针上调用reset。最后一个reset(或导致引用计数实际上降为零的任何其他操作)将导致该对象自动使用删除器进行释放。

也许您对Smart Pointer Programming Techniques感兴趣。它有一个关于delayed deallocation的条目。

答案 1 :(得分:9)

如果您希望能够有意删除对象(我一直这样做),那么您必须使用单一所有权。当您的设计不合适时,您已被诱惑使用shared_ptr。

答案 2 :(得分:8)

boost::shared_ptr<T>的重点是,当没有shared_ptr<T> s指向它时,指针对象将被完全删除 - 也就是说,当最后一个指向此对象的shared_ptr<T>超出范围或被重新分配以指向不同的对象。因此,删除对象所需要做的就是确保没有shared_ptr<T>指向它。例如。如果你只有一个名为shared_ptr<T>的{​​{1}}指向一个对象,要么让它超出范围,要么调用p(相当于p.reset()的普通指针) ,或指定它指向别的东西。

如果你有两个p = NULL指向对象,你需要重新分配它们。

编辑:感谢dehmann指出shared_ptr<T>实际上不是p = NULL;的有效代码......:)

答案 3 :(得分:4)

您要做的是使用boost::weak_ptr返回弱引用,可以在需要时将其转换为shared_ptr。这可以允许您控制shared_ptr中对象的生命周期,而那些想要访问它的对象可以保存在weak_ptr上并尝试转换为shared_ptr。如果转换失败,那么他们可以重新查询并将对象带回内存。