45

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

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

我在 中看到了一个函数get_deleter(shared_ptr<T> const & p)boost::shared_ptr但我不知道如何使用它,而且它旁边还写着实验性的。(我想我有 Boost 1.38。)

也许只是boost::shared_ptr为变量分配一个新的空?那应该丢弃旧值并将其删除。

4

4 回答 4

83

你只是做

ptr.reset();

请参阅shared_ptr 手册。它相当于

shared_ptr<T>().swap(ptr)

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

也许您对智能指针编程技术感兴趣。它有一个关于延迟释放的条目。

于 2009-03-07T03:51:29.003 回答
9

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

于 2009-08-07T08:49:09.953 回答
8

的全部意义在于boost::shared_ptr<T>,指针对象将在没有 s 指向它的那一刻被删除——也就是说,当最后一个指向该对象超出范围或被重新分配以指向另一个对象时。因此,删除对象所需要做的就是确保没有s 指向它。例如,如果你只有一个指向一个对象的被调用,要么让它超出范围,要么调用(相当于一个普通指针),或者将它分配给指向别的东西。shared_ptr<T>shared_ptr<T>shared_ptr<T>shared_ptr<T>pp.reset()p = NULL

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

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

于 2009-03-07T03:55:20.693 回答
4

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

于 2009-04-18T03:48:56.283 回答