Возвращается ли значение std::unique ptr:: get valid после перемещения уникального ptr?
рассмотрим следующий фрагмент кода:
class Owner {
public:
Owner(std::unique_ptr<int> ptr) : owned_pointer<int>(std:move(ptr)) {}
private:
std::unique_ptr<int> owned_pointer;
};
std::unique_ptr<int> ptr(new int);
int* ptr1 = ptr.get();
Owner new_owner(std::move(ptr));
можно ли предположить, что ptr1 действителен, пока new_owner остается в области видимости? Кажется, это работает, но я не могу найти спецификацию, в которой говорится, что явно - это неопределенное поведение/реализация, специфичная и просто работает для меня, или код, опубликованный выше, действителен (ptr1 гарантированно указывает на перемещенный указатель, пока он остается в живых)?
2 ответов
да, спецификация C++11 гарантии переход права собственности на объект от одного unique_ptr в другой unique_ptr не изменяет местоположение самого объекта, и это get() на втором unique_ptr возвращает то же самое, что и в первом unique_ptr до передачи.
глядя на N3337, раздел 20.7.1:
кроме того,
uможет, по запросу передача собственность к другому уникальному указателюu2. По завершении такой передачи: postconditions hold:
u2.pравно предварительной передачеu.p,u.pравнаnullptrи- если до передачи
u.dподдерживаемое состояние, такое состояние было переданоu2.d.
здесь u это unique_ptr объект, который хранит указатель u.p.
первая пуля отвечает на вопрос прямо, так как get() указан как возврат u.p.
Да, действительно.
вы можете иметь несколько (обычный) указателей, указывающих на один и тот же объект. Вопрос в том, как долго эти указатели действительны или когда объект, на который они указывают, удаляется.
A unique_ptr сохраняет еще один простой указатель и берет на себя ответственность, то есть он отвечает за то, когда объект уничтожен. Переместить его в другой unique_ptr просто передает право собственности, сам объект остается прежним, и все простые указатели, указывающие на него, остаются действительный.
только тогда, когда право собственности не передается (или освобождается) и владение unique_ptr разрушается, он также разрушает объект. Это будет момент, когда все простые указатели, указывающие на объект, станут болтающимися указателями, и разыменование их будет незаконным.