如何故意删除boost :: shared_ptr?

Fra*_*ank 45 c++ boost memory-management shared-ptr

我有很多boost::shared_ptr<MyClass>对象,在某些时候我故意想要delete其中一些来释放一些记忆.(我知道那时我将永远不再需要尖头MyClass物体了.)我怎么能这样做?

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

我见过一个函数get_deleter(shared_ptr<T> const & p)boost::shared_ptr,但我不知道如何使用它,并且还表示,实验就在旁边.(我想我有1.38升.)

也许只是boost::shared_ptr为变量分配一个新的空?这应该扔掉旧值并删除它.

Joh*_*itb 82

你这样做

ptr.reset();
Run Code Online (Sandbox Code Playgroud)

请参阅shared_ptr手册.它相当于

shared_ptr<T>().swap(ptr)
Run Code Online (Sandbox Code Playgroud)

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

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


小智 9

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


j_r*_*ker 8

整点boost::shared_ptr<T>是,而指向对象将被删除恰好在那一刻没有shared_ptr<T>在IT方面一点-那就是,当最后shared_ptr<T>这个对象指向超出范围或重新分配给指向不同的对象.因此,删除对象所需要做的就是确保没有shared_ptr<T>指向它的东西.例如,如果你只有一个shared_ptr<T>被调用p指向一个对象,要么让它超出范围,要么调用p.reset()(相当于p = NULL普通指针),或者指定它指向其他东西.

如果你有两个shared_ptr<T>指向对象,你需要重新分配它们.

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

  • 听起来不错,但有一点:你不能写p = NULL,因为p是shared_ptr,而不是指针. (3认同)