Два std :: unique_ptr, указывающие на один и тот же объект - неопределенное поведение? - PullRequest
0 голосов
/ 07 октября 2019

Принимая следующий код:

T* t = new T();
std::unique_ptr<T> p1(t);
std::unique_ptr<T> p2(t);

Очевидно, что теперь два std::unique_ptr s указывают на один и тот же объект. Это состояние само по себе уже неопределенное поведение? Я не смог найти подходящих подсказок в стандарте, поэтому пока отвечу «нет», но хочу быть уверен.

Примечание: этот вопрос не о неопределенном поведении, полученном двойным удалением позжеon, чего можно избежать, если один из указателей release() в нужное время введет его содержимое ...

1 Ответ

2 голосов
/ 07 октября 2019

Технически нет UB, пока вы не сделаете что-то, что приведет к двойному удалению. Конструктор std::unique_ptr не указывает, что указатель уже не должен принадлежать, , поэтому в самом строгом смысле этого слова не является неопределенным поведением указатель, которому должны два объекта

* 1005Тем не менее, семантически код не является правильным, и это не должно быть сделано. Вы нарушаете уникальную гарантию владения, которую дает std::unique_ptr, а это означает, что вы должны быть очень осторожны при использовании этих объектов, чтобы не оказаться в двойном удаленном состоянии.
...