Что не так, чтобы сбросить 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