Слабый указатель на это в конструкторе - PullRequest
8 голосов
/ 05 января 2011

Я понимаю, что невозможно получить shared_ptr, вызвав shared_from_this () из конструктора класса, так как объект еще не создан. Возможно ли, однако, получить слабый_птр для объекта из конструктора? В некоторых публикациях на форуме, посвященных обсуждению метода "weak_from_raw ()", это возможно.

Редактировать: Форма для обсуждения обсуждений слабых_фреймов http://lists.boost.org/boost-users/2010/08/61541.php

Ответы [ 2 ]

15 голосов
/ 05 января 2011

Я думаю, что вы ссылаетесь это .Который, кажется, не был объединен с буст-релизом (может быть ошибочным).

Из буст-документации :

Часто задаваемые вопросы

Q. Может ли объект создать для себя слабый_птр в своем конструкторе?

А. Нет. Слабый_птр может быть создан только изshared_ptr, и во время создания объекта не существует shared_ptr для объекта.Даже если бы вы могли создать для этого временный shared_ptr, он бы вышел из области видимости в конце конструктора, и все экземпляры weak_ptr немедленно истекли бы.

Решение состоит в том, чтобы сделать конструктор частным и предоставитьфабричная функция, которая возвращает shared_ptr:

class X
{
private:

    X();

public:

    static shared_ptr<X> create()
    {
        shared_ptr<X> px(new X);
        // create weak pointers from px here
        return px;
    }
};
5 голосов
/ 05 января 2011

См .: http://boost.org/doc/libs/1_42_0/libs/smart_ptr/sp_techniques.html#in_constructor

Проблема не в том, что объект не построен.Проблема в том, что shared_ptr не был создан.Если бы все, что вам нужно было сделать, это создать shared_ptr и отправить его куда-нибудь, все было бы хорошо.Это когда вы пытаетесь создать shared_ptr для содержания объекта, который вы только что создали.Нет никакого способа соединить их, и поэтому у вас есть большая проблема.

Способ, которым shared_from_this работает, заключается в том, что он ожидает, что вы поместите объект в shared_ptr, прежде чем когда-либо вызовете shared_from_this для получения доступа к нему.Поскольку вы еще этого не сделали, поскольку конструктор объекта еще не завершен, и поэтому shared_ptr не подключен к нему, вы не можете вызвать shared_from_this.

У вас точно такая же проблема сweak_ptr.

Итак, другими словами, эта абсурдная конструкция будет работать:

struct absurd
{
  absurd()
  {
    register(shared_ptr<absurd>(this));
  }
};

...
new absurd; // better not assign to a shared_ptr!!!

Но вы действительно не хотите этого делать.

...