Могут ли разные умные указатели ссылаться на один и тот же объект?

0

Возможно иметь weak_ptr вместе с shared_ptr. Но я хотел знать, можно ли создать shared_ptr и unique_pointer, ссылающиеся на один и тот же объект. Если да, какое правило должно соблюдаться?

  • 0
    Может, но тогда было бы плохо .. и тогда нет смысла использовать умные указатели.
  • 1
    Сама идея более уникальный указатель , ссылающийся объект несколько нелогичная приставка самого названия: уникальная. почему ты хочешь сделать это?
Показать ещё 2 комментария
Теги:
c++11
smart-pointers

1 ответ

3
Лучший ответ

Если вы создадите unique_ptr и shared_ptr для одного и того же объекта, они не будут знать друг о друге. Следовательно, вы получите "двойную свободную" ошибку, не говоря уже о том, что вы можете случайно разыменовать один указатель, когда другой уже освобожден.

Короче говоря, не делайте этого. Если вам нужно передать право собственности с unique_ptr на shared_ptr или наоборот, вызовите release() на "старый" указатель при создании "нового".

На ваш вопрос о том, "какое правило будет соблюдаться", ответ будет таким. Каждый умный указатель будет следовать своим собственным правилам, но общее поведение системы будет ошибочным. Точно так же, как если бы вы создали один умный указатель из необработанного указателя до или после вызова delete самостоятельно.

Обратите внимание, что те же рекомендации относятся к созданию двух unique_ptr или двух shared_ptr для одного и того же необработанного указателя. Тот факт, что вы смешиваете типы интеллектуальных указателей, не имеет особого значения.

  • 0
    Поправьте меня, если я ошибаюсь, но я верю, что 2 shared_ptr будут знать друг о друге, поскольку они будут совместно владеть одним и тем же объектом. В этом случае у вас не будет ошибки «двойного освобождения», и вы не будете случайно разыменовывать один указатель при освобождении другого. Только когда последний shared_ptr с владельцем выходит из области видимости, объект будет освобожден.
  • 0
    @Ninja: Это верно только в том случае, если два shared_ptr знают друг о друге. Это будет иметь место, если вы создадите одно из другого, или если вы используете enable_shared_from_this . Но если они оба созданы из одного и того же необработанного указателя, они не будут знать друг о друге, и результатом будет двойное освобождение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню