如何故意删除一个boost :: shared_ptr?
我有很多boost::shared_ptr<MyClass>
对象,并在某些时候我故意要delete
其中的一些来释放一些内存。 (我知道那时我将永远不需要指向MyClass
对象了。)我该怎么做?
我猜你不能用我用get()
得到的原始指针调用delete()
get()
。
我在boost::shared_ptr
看到了函数get_deleter(shared_ptr<T> const & p)
,但是我不确定如何使用它,并且它旁边的实验就是这样说的。 (我认为我有提升1.38。)
也许只是分配一个新的空的boost::shared_ptr
的variables? 这应该扔掉旧的价值,并删除它。
你只是做
ptr.reset();
请参阅shared_ptr手册 。 这相当于
shared_ptr<T>().swap(ptr)
你调用每一个不应该引用对象的智能指针的reset
。 最后一次这样的reset
(或实际上导致引用计数下降到零的任何其他操作)将使对象自动使用删除器释放。
也许你对智能指针编程技术感兴趣。 它有一个关于延迟释放的入口。
如果你想能够有意删除对象(我一直在做),那么你必须使用单一的所有权。 当你的devise不适合使用shared_ptr的时候,你已经被诱惑了。
boost::shared_ptr<T>
要点在于指针对象在没有shared_ptr<T>
指向的时刻正好被删除 – 也就是说,当指向这个对象的最后一个shared_ptr<T>
超出范围或被重新分配指向不同的对象。 所以,你所要做的删除一个对象是确保没有shared_ptr<T>
指向它。 例如,如果只有一个名为p
shared_ptr<T>
指向一个对象,或者让它超出范围,或者调用p.reset()
(相当于普通指针的p = NULL
),或者将它指定给point在别的东西。
如果有两个shared_ptr<T>
指向该对象,则需要重新分配这两个对象。
编辑:感谢dehmann指出p = NULL;
实际上并不是一个shared_ptr<T>
有效的代码shared_ptr<T>
… 🙂
你想要做的就是返回使用boost :: weak_ptr的弱引用,在需要时可以将其转换为shared_ptr。 这可以让你控制shared_ptr中的对象的生命周期,那些想访问它的对象可以保存在weak_ptr上,并尝试转换为shared_ptr。 如果转换失败,那么他们可以重新查询并将对象带回内存。