Перехват памяти Realloc - PullRequest
       21

Перехват памяти Realloc

0 голосов
/ 18 сентября 2018

Я хочу прочитать несколько файлов и добавить строки текста к содержанию.Я хотел бы сохранить новый измененный контент в буфере.Размер файла может быть от 0 до 16 МБ.Добавляя строки текста, файл также может быть намного больше, в зависимости от содержимого.

В начале я резервирую 512 байт памяти с помощью calloc.

wchar_t *buffer = (wchar_t*)calloc(512, sizeof(wchar_t));

При каждом добавлениитекст в память, я проверяю, достаточен ли размер зарезервированной памяти с помощью функции realloc.Это работает довольно надежно для маленьких файлов, только с большими файлами программа вылетает.Debbug, к сожалению, невозможен из-за созвездия.

Теперь мой вопрос.Если я неоднократно расширяю память с помощью realloc, но это не удается, верно ли утверждение if с буфером == NULL?Буфер теоретически не может быть нулевым, поскольку он уже был заполнен ранее.

Как я могу отловить ошибку или исправить ее?

size_t memoryallocated = 512;

wchar_t *buffer = (wchar_t*)calloc(memoryallocated , sizeof(wchar_t));          
while (memoryuse + contenlength >= memoryallocated)
{
 memoryallocated *= 2;
 buffer = (wchar_t *)realloc(buffer, memoryallocated* sizeof(wchar_t));     
 if ((buffer == NULL))
 {
   return NULL;
 }
}

wmemcpy(buffer + memoryuse, contentbuf,contenlength);
memoryuse += contenlength;    // thx @pm100

return buffer;

1 Ответ

0 голосов
/ 18 сентября 2018

Если вы прочитали документацию для realloc, вы увидите, что функция возвращает NULL, если не может изменить размер вашего буфера (из-за нехватки памяти или по любой другой причине). Он не возвращает старый указатель.

Таким образом, сравнение возвращаемого значения с NULL абсолютно правильно.

Кроме того, вы никогда не должны делать

buffer = realloc(buffer, ...);

Потому что, если realloc возвращает NULL, вы потеряли старый указатель, который не был освобожден (realloc не освобождается, если он не может перераспределить). Это приведет к утечке памяти.

Вы всегда должны делать -

void * new_ptr = realloc(buffer, new_size); // new_size > 0 

if (new_ptr == NULL) {
    // Handle error and keep using buffer
} else {
    buffer = new_ptr;
}
...