Немедленно разыменование unique_ptr

Я не очень знаком с современным C++ и хотел бы лучше понять следующий фрагмент:

State & m_rootstate;
//...
auto currstate = std::make_unique<State> (m_rootstate);
do_something (*currstate);
// currstate is not used anywhere else

я вижу unique_ptr создается из ссылки на State, Это должно использовать копию ctor State создать новый экземпляр Stateи указатель на этот новый экземпляр оборачивается currstate,

currstate затем немедленно разыменовывается как аргумент функции. currstate после этого не используется, но не выходит из области действия, пока не завершится вызов, поэтому он и его связали State не разрушаться преждевременно.

Для вызова значение внутри unique_ptr используется. В зависимости от того do_something занимает State или же State&, он будет скопирован снова или нет.

Это правильно? Если да, то верно ли, что цель unique_ptr только для создания копии m_rootstate не беспокоясь об управлении памятью?

2 ответа

State & m_rootstate; 

Это не имеет смысла само по себе - я предполагаю, что вы оставили важные вещи. Ссылка должна быть инициализирована.

//...
auto currstate = std::make_unique<State> (m_rootstate);

Это создает новый State и оборачивает это в unique_ptr (в данном случае через конструктор копирования, так что вы правы, это копия)

do_something (*currstate);
// currstate is not used anywhere else

В зависимости от того, принимает ли do_something штат или штат &, оно будет скопировано снова или нет. Правда.

Если это так, верно ли, что цель unique_ptr состоит только в том, чтобы создать копию m_rootstate, не беспокоясь об управлении памятью?

В этом случае кажется ненужным создавать unique_ptr на первом месте. С таким же успехом вы можете просто создать прямую копию стека следующим образом:

State currstate(m_rootstate);

Это правильно?

Ваше описание точно, да.

Если вы хотите спросить, правильно ли определена программа: не обращая внимания на неинициализированную ссылку в начале, не будет показан код, который был бы либо неправильно сформирован, либо имел бы неопределенное поведение. Тем не менее, вы не показали полную программу, поэтому мы не можем знать, является ли полная программа правильной.


Если да, то верно ли, что цель unique_ptr только для создания копии m_rootstate не беспокоясь об управлении памятью?

Правильный. Забота об управлении памятью динамического выделения действительно является целью уникального класса указателя. (Или, в более общем смысле, заботясь об освобождении ресурса).

Обратите внимание, что показанный отрывок не показывает, зачем или вообще нужно динамическое размещение. Это также не показывает, зачем или нужна ли копия. Может быть, эти вещи нужны. Тем не менее, этих вещей следует избегать, когда они не нужны.

Другие вопросы по тегам