重新分配内存拦截

Realloc Memory Intercept

我想读取几个文件并在内容中添加文本行。我想将新更改的内容保存在缓冲区中。这些文件的大小可以从 0 字节到 16 MB。通过添加文本行,文件也可以更大,具体取决于内容。

一开始我用calloc预留了512字节的内存

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

每当将文本添加到内存时,我都会使用函数 realloc 检查保留内存的大小是否仍然足够。这对小文件非常可靠,只有大文件程序崩溃。不幸的是,由于星座的原因,无法进行调试。

现在我的问题。 如果我用 realloc 重复扩展内存但它失败了,那么 buffer == NULL 的 if 语句是否正确?缓冲区理论上不能为零,因为它之前已经被填满了。

我怎样才能清楚地捕捉到错误或修复它?

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;

如果您阅读 realloc 的文档,您可以看到函数 returns NULL 如果它无法调整缓冲区大小(由于内存不足或任何其他原因) .它没有 return 旧指针。

所以将 returned 值与 NULL 进行比较是绝对正确的。

除此之外你永远不应该

buffer = realloc(buffer, ...);

因为如果 realloc returns 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;
}