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