如何故意删除一个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。 如果转换失败,那么他们可以重新查询并将对象带回内存。