Сайт cplusplus.com, как правило, не так строго относится к использованию языка, особенно по отношению к стандарту. Он предпочитает более местный язык и поэтому может сбивать с толку.
Это особенно относится к тому, что означает для smart_ptr
«владеть» чем-то. Из стандарта :
A shared_ptr
называется пустым, если у него нет указателя.
Это относится к shared_ptr
идея "собственности". С точки зрения shared_ptr
, он «владеет» указателем, если он создан со значением указателя, на которое он вызовет функтор удаления (заданный или по умолчанию). Любой shared_ptr
, который не «владеет» указателем таким образом, пуст.
Однако это отличается от того, что человек считает «собственностью». Человек может сказать, что если вы предоставите удалитель для shared_ptr
, который на самом деле не удалит объекта или не освободит его иным образом, то shared_ptr
не действительно владеть указателем.
Но что касается shared_ptr
(и его различных интерфейсов), он владеет этим указателем, даже если ваш удалитель не собирается ничего с ним делать.
Что касается обработки вашего кода, заданного c, было бы лучше использовать unique_ptr
и условно присвоить ему значение для уничтожения:
void foo(const MyClass* p) {
unique_ptr<MyClass> u_p;
if (p == nullptr) {
u_p = std::make_unique<MyClass>("some", "parameters");
p = u_p.get();
}
p->doSomething();
...
p->doSomethingElse();
// p must not be destroyed, its memory is managed somewhere else
}