weak_from_this () в конструкторе - PullRequest
0 голосов
/ 28 мая 2018

Я знаю, что вы не можете использовать shared_from_this из конструктора.Но можно ли использовать новый weak_from_this из конструктора?Согласно cppreference:

Это копия закрытого изменяемого члена слабого_птр, который является частью enable_shared_from_this.

http://en.cppreference.com/w/cpp/memory/enable_shared_from_this/weak_from_this

Я не знаюЯ не вижу проблемы в получении копии внутренне сохраненного слабого_потока из конструктора, но я могу что-то упустить, так что я не уверен в этом.

1 Ответ

0 голосов
/ 29 мая 2018

Вы можете назвать это, но 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);

последовательность:

  1. Реализация вызывает operator new(sizeof(MyClass)) для получения некоторого хранилища.

  2. Реализация вызывает конструктор MyClass длясоздайте объект в этом хранилище.

    • Если MyClass наследует специализацию std::enable_shared_from_this, он содержит подобъект std::weak_ptr.Конструктор по умолчанию weak_ptr используется для создания пустого интеллектуального указателя.
  3. Реализация вызывает конструктор 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.Но это, похоже, наизнанку от обычного способа ведения дел.

...