gpt4 book ai didi

c - 重新分配内存拦截

转载 作者:太空宇宙 更新时间:2023-11-04 07:53:21 24 4
gpt4 key购买 nike

我想读取几个文件并在内容中添加文本行。我想将新更改的内容保存在缓冲区中。这些文件的大小可以从 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 的文档,您可以看到如果函数无法调整缓冲区大小(由于内存不足或任何其他原因),它会返回 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;
}

关于c - 重新分配内存拦截,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52376866/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com