我有很多boost::shared_ptr<MyClass>
个对象,在某些时候我故意想delete
其中一些对象释放一些记忆。 (我知道那时我将永远不再需要指向MyClass
个对象了。)我怎么能这样做?
我猜你不能只用我delete()
带来的原始指针调用get()
。
我在get_deleter(shared_ptr<T> const & p)
中看到了一个函数boost::shared_ptr
,但我不确定如何使用它,并且它旁边还有 experimental 。 (我想我有1.38升。)
也许只是为变量分配一个新的空boost::shared_ptr
?这应该扔掉旧值并删除它。
答案 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。如果转换失败,那么他们可以重新查询并将对象带回内存。