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.
Answers to questions are automatically generated and may not have been reviewed.
std::shared_ptr
An introduction to shared memory ownership using std::shared_ptr