http://www.cplusplus.com/reference/memory/shared_ptr/ says
A shared_ptr that does not own any pointer is called an empty shared_ptr. A shared_ptr that points to no object is called a null shared_ptr and shall not be dereferenced. Notice though that an empty shared_ptr is not necessarily a null shared_ptr, and a null shared_ptr is not necessarily an empty shared_ptr.
Am I able to create an empty std::shared_ptr, i.e. one which does not own anything but which is not null, i.e. contains payload?
The usecase is to marry "legacy" code with the modern pointers: Given that foo
's call syntax is not to be changed,
void foo(const MyClass* p) {
if (p == nullptr) {
auto defaultObject = std::make_shared<MyClass>("some", "parameters");
defaultObject->doSomething();
...
defaultObject->doSomethingElse();
// The default object must be destroyed again
} else {
p->doSomething();
...
p->doSomethingElse();
// p must not be destroyed, its memory is managed somewhere else
}
}
is there an implementation for doNotOwnButStillPointTo()
which allows this:
void foo(const MyClass* p) {
std::shared_ptr<MyClass> wrapper;
if (p == nullptr) {
// Create a default object
wrapper = std::make_shared<MyClass>("some", "parameters");
} else {
wrapper = doNotOwnButStillPointTo(p);
}
wrapper->doSomething();
...
wrapper->doSomethingElse();
// p mus not be destroyed, the default object (if created) shall be
}
Or, to not fall for the XY-Problem, is there a different smart pointer available or none at all?
- However, I want to add, that the line
std::make_shared<MyClass>("some", "parameters")
is actually a call to a more complex function which creates a shared_ptr. I'd like to retain this function and use its result
cplusplus.com
is a poor quality website for C++.cppreference.com
is much better. std::shared_ptr can be empty shared_ptr may have a non-null stored pointing if an aliasing constructor was used to create it. Such as from a downcast. – Eljayunique_ptr
here? In this case, yourshared_ptr
never leaves your scope, so there's no need for its ownership semantics to be shared. – Nicol Bolas