Повысить shared_from_this (), возвращая неправильный shared_ptr - PullRequest
0 голосов
/ 05 октября 2010

Я пытаюсь использовать boost :: shared_ptr и boost :: enable_shared_from_this безрезультатно. Похоже, что shared_from_this () возвращает неправильный shared_ptr. Вот что я вижу:

Task* task = new TaskSubClass();
boost::shared_ptr<Task> first = boost::shared_ptr<Task>(task); // use_count = 1, weak_count = 1
boost::shared_ptr<Task> second = first; // use_count = 2, weak_count = 1
boost::shared_ptr<Task> third = first->shared_from_this(); // use_count = 2, weak_count = 2

Я также заметил, что first.px=third.px, но first.pn.pi!=third.pn.pi. То есть они оба используют один и тот же объект, но используют разные счетчики. Как я могу получить два, чтобы разделить один и тот же счетчик?

1 Ответ

1 голос
/ 05 октября 2010

Оказывается, это было вызвано тем, что конструктор TaskSubClass вызвал некоторый метод, который, в свою очередь, вызвал new boost::shared_ptr<Task>(this) вместо new boost::shared_ptr<Task>(shared_from_this()). В качестве дополнительного бонуса, вы не должны вызывать shared_from_this() из конструктора, и документация далека от очевидной: There must exist at least one shared_ptr instance p that owns t. Это имеет смысл в ретроспективе, но документация действительно должна быть более четко:)

Извините за вводящий в заблуждение вопрос.

...