Creating a shared_ptr to this

Is it okay to create a shared_ptr from the this pointer?

No, creating a shared_ptr from the this pointer is almost always a mistake. Consider this example:

#include <memory>

class Example {
public:
  std::shared_ptr<Example> GetPtr() {
    return std::shared_ptr<Example>(this);
  }
};

int main() {
  Example e;
  auto ptr = e.GetPtr();
}

The issue here is that the shared_ptr does not own the object it's pointing to. The object e is owned by the main function, not by any shared_ptr.

When the shared_ptr ptr is destroyed, it will attempt to delete the Example object. But this object was not dynamically allocated, and is not owned by the shared_ptr. This leads to undefined behavior, likely a crash.

The same issue occurs if you try to create a shared_ptr from the this pointer inside a member function.

The correct way to create a shared_ptr that owns an Example object is:

#include <memory>

class Example {
 public:
  static std::shared_ptr<Example> Create() {
    return std::shared_ptr<Example>(
      new Example());  
  }

 private:
  Example() {}  // Private constructor
};

int main() { auto ptr = Example::Create(); }

Now, the shared_ptr returned by Create() has ownership of the dynamically allocated Example object. When ptr is destroyed, the Example object will be safely deleted.

Shared Pointers using std::shared_ptr

An introduction to shared memory ownership using std::shared_ptr

Questions & Answers

Answers are generated by AI models and may not have been reviewed. Be mindful when running any code on your device.

Deleting a Shared Pointer Twice
What happens if I manually delete a shared pointer twice using the delete keyword?
Polymorphism with Shared Pointers
How do shared pointers handle polymorphism? Can I store derived class objects in a shared_ptr of base class type?
Shared Pointers in Multithreaded Environments
Are shared pointers thread-safe? Can they be used in multithreaded applications?
Shared Pointer Cyclic References
What happens if two shared pointers reference each other? Will this cause a memory leak?
When to Use Shared Pointers
In what situations should I use shared pointers instead of unique pointers or raw pointers?
Or Ask your Own Question
Get an immediate answer to your specific question using our AI assistant