auto foo = getSharedPointer().get();
Всякий раз, когда функция возвращает тип, который не является ссылкой, то результат вызова функции является Rvalue. Кроме того, поскольку функция getSharedPointer()
возвращает тип класса, результатом является временный объект.
Срок службы этого временного объекта определяется как окончание оценки самого внешнего выражения, здесь getSharedPointer().get()
. Как только переменная foo
инициализируется, интеллектуальный указатель владельца уничтожается; когда последний shared_ptr
, владеющий этим объектом, уничтожается, объект удаляется.
Здесь getSharedPointer()
всегда возвращает shared_ptr
, что не разделяет управляемый объект (use_count()
в 1), так что, когда эта копия последнего shared_ptr
уничтожается объект уничтожается и указатель на объект является недействительным.
(я не знаю, почему вы возвращаете shared_ptr
, а не unique_ptr
здесь.)
Правильное использование интеллектуального указателя или любого класса, который «владеет» (контролирует срок службы) других ресурсов (ресурсы, которым вы по-прежнему разрешены напрямую), заключается в том, чтобы сохранить «умного» указателя/владельца в живых до тех пор, пока вам нужно получить доступ к ресурсу ressource.
Таким образом, нужно называть «умный» указатель (владеющий объектом). Кроме того, я не уверен, что вы действительно хотите скрыть тот факт, что это умный указатель с точки зрения читателя с auto
.
std::shared_pointer<Bar> foo = getSharedPointer();
// use foo.get()
Вы можете скрыть точный тип управляемого объекта:
std::shared_pointer<auto> foo = getSharedPointer();
Не может найти 'getSharedPointer' описывался в стандартной библиотеке или общих третьих лицах. Не знаю, что произойдет. Порекомендуйте добавить немного больше информации. – user4581301