Возвращается ли значение 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
разрушается, он также разрушает объект. Это будет момент, когда все простые указатели, указывающие на объект, станут болтающимися указателями, и разыменование их будет незаконным.