Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to intentionally delete a boost::shared_ptr?

I have many boost::shared_ptr<MyClass> objects, and at some point I intentionally want to delete some of them to free some memory. (I know at that point that I will never need the pointed-to MyClass objects anymore.) How can I do that?

I guess you can't just call delete() with the raw pointer that I get with get().

I've seen a function get_deleter(shared_ptr<T> const & p) in boost::shared_ptr, but I'm not sure how to use it, and also it says experimental right next to it. (I think I have Boost 1.38.)

Maybe just assign a new empty boost::shared_ptr to the variable? That should throw away the old value and delete it.

like image 704
Frank Avatar asked Mar 07 '09 03:03

Frank


People also ask

Can you delete a shared_ptr?

[Edit: you can delete a shared_ptr if and only if it was created with new , same as any other type.

Can you return a shared_ptr?

So the best way to return a shared_ptr is to simply return by value: shared_ptr<T> Foo() { return shared_ptr<T>(/* acquire something */); }; This is a dead-obvious RVO opportunity for modern C++ compilers.

What is boost :: shared_ptr?

shared_ptr is now part of the C++11 Standard, as std::shared_ptr . Starting with Boost release 1.53, shared_ptr can be used to hold a pointer to a dynamically allocated array. This is accomplished by using an array type ( T[] or T[N] ) as the template parameter.


2 Answers

You just do

ptr.reset(); 

See the shared_ptr manual. It is equivalent to

shared_ptr<T>().swap(ptr) 

You call reset on every smart pointer that should not reference the object anymore. The last such reset (or any other action that causes the reference count drop to zero, actually) will cause the object to be free'ed using the deleter automatically.

Maybe you are interested in the Smart Pointer Programming Techniques. It has an entry about delayed deallocation.

like image 195
Johannes Schaub - litb Avatar answered Sep 18 '22 18:09

Johannes Schaub - litb


If you want to be able to intentionally delete objects (I do all the time) then you have to use single ownership. You have been lured into using shared_ptr when it is not appropriate to your design.

like image 33
John Morrison Avatar answered Sep 19 '22 18:09

John Morrison