c ++ перемещает семантику при использовании указателей - PullRequest
0 голосов
/ 18 февраля 2020

Как использовать оператор присваивания move при работе с необработанными указателями.

Есть ли другой способ, кроме как сделать что-то вроде:

void Function(T* dest)
{
    T* src = LoadT();
    (*dest) = std::move(*src);
    delete src;
}

Ответы [ 3 ]

3 голосов
/ 18 февраля 2020

Ваш ход в порядке. Объект, на который указывает sr c, будет перемещен в объект, на который указывает dest.

Об обновленном примере кода, версия с функцией:

Если ваш LoadT () возвращает необработанный указатель на объект, выделенный с помощью new, который не будет сохранен где-то еще, а затем удален, у вас будет утечка памяти. * этого объекта, объект сам остается живым, только "пустым" / в любом состоянии, в котором вы оставляете его после перемещения.

Если вы возвращаете указатель на объект, принадлежащий кому-то иначе и будет очищен каким-либо образом за пределы кода, который вы видите здесь, вы можете сделать это явным, изменив указатели на ссылки - таким образом, вы явно укажете, что: a) указатели гарантированно не будут нулевыми; b) что не следует беспокоиться об удалении объекта, полученного из LoadT, поскольку ссылка не может владеть этим объектом.

0 голосов
/ 18 февраля 2020

Вы хотите, чтобы указали на объект s, перемещенные друг на друга, тогда вы уже делаете это правильным / стандартным / единственным способом, то есть разыменование указатель и затем перемещение *src на *dest.


При этом ваш интерфейс семантически 'проблематичен c . Указатель на функцию по соглашению означает не владеющий и необязательный. Владение, кажется, не является проблемой здесь, но необязательно. Зачем использовать указатель, когда вы можете использовать ссылку? и более того, зачем использовать ссылку, когда вы можете просто использовать возвращаемое значение?

Фактически вы можете упростить до:

T Function()
{
    return LoadT();
}

Тогда пусть пользователи функции решат, как лучше всего использовать T. Если Это полиморф c, вы можете вернуть std::unique_ptr<T>.

0 голосов
/ 18 февраля 2020

Если вы не ссылаетесь на объекты во временной переменной, вам не повезло. Технически (не уверен, что это незаконно) вам разрешено указать собственную специализацию move, в которой вы можете скрыть это поведение. Но в тот или иной момент вы должны разыменовать эти указатели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...