Что делает release и какова его роль?
Я новичок в с++, занимаюсь умными указателями и наткнулся на метод, о котором ничего понять не могу, release
Есть некий unique_ptr в стиле с(с free/malooc/realloc) в который надо прочитать из файлового потока данные.
std::unique_ptr<char[], decltype(std::free) *> arr(static_cast<char *>(malloc(size)), std::free);
while(fin)
{
fin.read(&arr[count], size);
count += fin.gcount();
if(fin.gcount() == size)
{
overSize += size;
std::unique_ptr<char[], decltype(std::free) *> temp(static_cast<char *>(realloc(arr.get(), overSize)), std::free);
arr.release();
std::swap(arr, temp);
}
}
То есть, некий размер массива изначальный, а потом с помощью realloc переалоцируем массив, если количество символов в файле больше начального размера и так несколько раз. Не очень понятна роль release(), то есть, когда писал reset() все крашелось, c просто move не работает. Прошу рассказать, что делает release и какова его роль
Ответы (1 шт):
release возвращает указатель, который хранится в unique_ptr, и убирает его из unique_ptr - при этом не освобождая память!
Без этого вы пытались освободить старую память - что никак не соответствует семантике realloc, который сам эту память освобождает (или не меняет указатель, что приводит к ничуть не лучшему поведению).
Так что очень советую послушать Harry - все С++ные штучки заточены под С++ные способы работы.