Возможно иметь weak_ptr вместе с shared_ptr. Но я хотел знать, можно ли создать shared_ptr и unique_pointer, ссылающиеся на один и тот же объект. Если да, какое правило должно соблюдаться?
Если вы создадите unique_ptr
и shared_ptr
для одного и того же объекта, они не будут знать друг о друге. Следовательно, вы получите "двойную свободную" ошибку, не говоря уже о том, что вы можете случайно разыменовать один указатель, когда другой уже освобожден.
Короче говоря, не делайте этого. Если вам нужно передать право собственности с unique_ptr на shared_ptr или наоборот, вызовите release()
на "старый" указатель при создании "нового".
На ваш вопрос о том, "какое правило будет соблюдаться", ответ будет таким. Каждый умный указатель будет следовать своим собственным правилам, но общее поведение системы будет ошибочным. Точно так же, как если бы вы создали один умный указатель из необработанного указателя до или после вызова delete
самостоятельно.
Обратите внимание, что те же рекомендации относятся к созданию двух unique_ptr
или двух shared_ptr
для одного и того же необработанного указателя. Тот факт, что вы смешиваете типы интеллектуальных указателей, не имеет особого значения.
shared_ptr
будут знать друг о друге, поскольку они будут совместно владеть одним и тем же объектом. В этом случае у вас не будет ошибки «двойного освобождения», и вы не будете случайно разыменовывать один указатель при освобождении другого. Только когда последний shared_ptr
с владельцем выходит из области видимости, объект будет освобожден.
shared_ptr
знают друг о друге. Это будет иметь место, если вы создадите одно из другого, или если вы используете enable_shared_from_this
. Но если они оба созданы из одного и того же необработанного указателя, они не будут знать друг о друге, и результатом будет двойное освобождение.