I'm new to shared_ptr's and I'm trying to figure out the exact functionality of the .reset() function.
#include <memory> #include <stdio> using namespace std; class SomeClass{}; int main() { shared_ptr<SomeClass> sp (nullptr); //do some stuff, sp now has 10 co-owners cout << sp.use_count << endl; sp.reset(); cout << sp.use_count << endl; return 0; } Would output
10 0 So since I used the reset function are all instances deleted from memory? As in, have I just eliminated any possible memory leaks with sp? Obviously this was a toy example that I quickly made up, sorry if it has any errors.
Follow up situation:
shared_ptr<SomeClass> returnThis() { shared_ptr<SomeClass> someObject(new SomeClass(/*default constructor for example*/) ); return someObject; } somehere in main:
shared_ptr<SomeClass> mainObject; mainObject = returnThis(); Does mainObject have a use count of 2 because someObject was created in a function but never cleared? Or is it one and the clean-up is done automatically when returning the value?
std::shared_ptr<T>::reset. Replaces the managed object with an object pointed to by ptr . Optional deleter d can be supplied, which is later used to destroy the new object when no shared_ptr objects own it. By default, delete expression is used as deleter.
If you've allocated a shared_ptr dynamically then you're certainly allowed to delete it whenever you want.
A shared_ptr may share ownership of an object while storing a pointer to another object. get() returns the stored pointer, not the managed pointer.
When you use .reset(), you are eliminating one owner of the pointer, but all of the other owners are still around. Here is an example:
#include <memory> #include <cstdio> class Test { public: ~Test() { std::puts("Test destroyed."); } }; int main() { std::shared_ptr<Test> p = std::make_shared<Test>(); std::shared_ptr<Test> q = p; std::puts("p.reset()..."); p.reset(); std::puts("q.reset()..."); q.reset(); std::puts("done"); return 0; } The program output:
p.reset()... q.reset()... Test destroyed. done
Note that p and q are both owners of the object, and once both p and q are reset, then the instance is destroyed.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With