Вы можете назвать это, но weak_ptr
обычно будет просто пустым.
Смысл shared_from_this
не в том, чтобы просто сделать shared_ptr
, а в том, чтобы получить shared_ptr
, который разделяетвладение с набором существующих shared_ptr
указателей.И смысл weak_ptr
состоит в том, чтобы предоставить способ получения shared_ptr
, который разделяет владение, если в то время существуют другие shared_ptr
указатели, без увеличения срока службы, как при прямом хранении shared_ptr
.Поэтому, если shared_ptr
указателей на объект не существует, weak_ptr
не может указывать на тот же объект.
Обратите внимание, что при обычном использовании, когда вы делаете что-то вроде
std::shared_ptr<MyClass> p(new MyClass);
последовательность:
Реализация вызывает operator new(sizeof(MyClass))
для получения некоторого хранилища.
Реализация вызывает конструктор MyClass
длясоздайте объект в этом хранилище.
- Если
MyClass
наследует специализацию std::enable_shared_from_this
, он содержит подобъект std::weak_ptr
.Конструктор по умолчанию weak_ptr
используется для создания пустого интеллектуального указателя.
Реализация вызывает конструктор std::shared_ptr<MyClass>
для создания интеллектуального указателя, передавая указатель наобъект MyClass
.
- Конструктор
shared_ptr
проверяет, указывает ли указатель на тип класса, который наследует совместимую специализацию std::enable_shared_from_this
.Если это так, подобъект std::weak_ptr
внутри объекта класса переназначается как копия создаваемого shared_ptr
.
То есть в конструкторе MyClass
вы были бы в шаге 2. Но внутренний указатель, используемый shared_from_this()
и weak_from_this()
, становится бесполезным до шага 3.
[Подобное переназначение weak_ptr
происходит во время std::make_shared
и std::allocate_shared
.В этих случаях Стандарт, очевидно, не говорит, что weak_ptr
назначается после создания целевого наведенного объекта, но для реализации было бы очень необычно и неожиданно приложить дополнительные усилия, чтобы каким-то образом волшебным образом что-то сделать дляweak_ptr
в некоторый момент между созданием базового подобъекта enable_shared_from_this
и выполнением тела конструктора производного класса.]
Возможно, вы можете создать std::shared_ptr
, который будет указывать на this
изнутри классаконструктор, чтобы сохранить его в другой переменной или контейнере или что-то еще.(Но если вы используете средство удаления по умолчанию, убедитесь, что вы каким-то образом знаете, что объект действительно был создан с помощью скаляра new
!). После этого в конструкторе можно использовать как shared_from_this()
, так и weak_from_this()
, и он вернет что-то, связанное суже создан std::shared_ptr
.Но это, похоже, наизнанку от обычного способа ведения дел.