我有很多boost::shared_ptr<MyClass>对象,在某些时候我故意想要delete其中一些来释放一些内存。 (我知道那时我将永远不再需要指向MyClass的对象。)我该怎么做?

我猜你不能用delete()得到的原始指针调用get()

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

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

有帮助吗?

解决方案

你刚才

ptr.reset();

请参阅 shared_ptr手册。它相当于

shared_ptr<T>().swap(ptr)

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

也许您对智能指针编程技术感兴趣。它有关于延迟重新分配的条目。

其他提示

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

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

如果有两个<=> s指向对象,则需要重新分配它们。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top