Что не так, чтобы сбросить std::unique_ptr в указатель на массив?

Я вижу фрагмент кода, как показано ниже:

std::unique_ptr<uint8_t> mCache;
mCache.reset(new uint8_t[size]);

Кто-то сказал мне, что есть некоторые проблемы с этим кодом. Кто-нибудь может дать мне некоторые детали?

1 ответ

Решение

Дано std::unique_ptr<uint8_t> mCache;, когда mCache уничтожен его удалитель будет использовать delete уничтожить управляемый указатель (если есть), то есть освободить память для одного объекта. Но после mCache.reset(new uint8_t[size]); какие mCache Управляет указатель на массив, это означает, что он должен использовать delete[] вместо; с помощью delete чтобы освободить память для массива приводит к UB.

Код можно изменить на

std::unique_ptr<uint8_t[]> mCache; // mCache is supposed to manage pointer to array
mCache.reset(new uint8_t[size]);   // safe now
Другие вопросы по тегам