Копирование из необработанного указателя в умный указатель с использованием memcpy - PullRequest
2 голосов
/ 06 июня 2019

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

MATRIX* cache;
---
cache = new MATRIX[numRow*numCol];
if (cache == NULL) 
{
    return FAIL;
}
---
memset(cache, 0, sizeof(MATRIX)*numRow*numCol);
---
memcpy(cache, matrix, sizeof(MATRIX)*numRow*numCol);

Я пытался преобразовать их, чтобы они стали такими:

std::unique_ptr<MATRIX[]> cache;
---
cache = std::make_unique<MATRIX[]>(numRow*numCol);
if (cache == NULL) 
{
    return FAIL;
}
---
cache.reset();

Это правильно?Есть ли лучший способ написать это?Кроме того, я не уверен, что сделать memcpy C ++ аналог

memcpy(cache, matrix, sizeof(MATRIX)*numRow*numCol);

matrix - это просто необработанный указатель типа MATRIX *.Какие-либо предложения??Большое вам спасибо!

1 Ответ

7 голосов
/ 06 июня 2019

Ваша реализация верна, но вам не нужно вызывать reset для очистки памяти.Он будет обрабатываться автоматически классом std::unique_ptr, и для доступа к уникальной памяти указателя мы можем просто использовать метод get, например, следующий:

cache.get();

Следовательно, ваш memcpy будет выглядеть как

memcpy(cache.get(), matrix, sizeof(MATRIX)*numRow*numCol);
...