Возвращается ли значение 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:

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