unique_ptr без движения, почему это работает? - PullRequest
0 голосов
/ 28 мая 2018

Во время обзора кода я обнаружил, что функция C ++, ожидающая, что unique_ptr передается uniqe_ptr с помощью std :: move, но при этом функция не перемещает unique_ptr в качестве возвращаемого значения и не присваивает вызывающей стороне возвращаемый unique_ptr обратно в его unique_ptr, поэтому яЯ ожидаю, что это приведет к сбою.

Пример:

   std::unique_ptr<X> fun(std::unique_ptr<X> p) {
     // Do something with the unique_ptr p
     return p;
   }

В другом месте я нашел следующие звонки:

void someFunction() {
  auto p = std::make_unique<X>();
  //...
  fun(std::move(p));
  // Do something else
  fun(std::move(p));
  //...
}

Так что мне интересноэтот код в порядке, или если это просто удача, что он выполняется.

[EDIT]: завершен пример

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Мне кажется, что намерение было вызвать fun следующим образом:

p = fun(std::move(p));
p = fun(std::move(p));

В этом случае владение p будет передаваться туда и обратно в функцию и из нее.Я бы предпочел сделать fun пустой функцией и передать p по ссылке или даже как необработанный X* тип.

0 голосов
/ 28 мая 2018

В этом фрагменте:

fun(std::move(p));
fun(std::move(p));

p перемещено из, что оставляет его нулевым.Итак, во второй раз, когда вы звоните fun(), он получает нулевой указатель.Это нормально, если только он не разыменовывает этот указатель.

...