重新分配内存拦截
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;
}
我想读取几个文件并在内容中添加文本行。我想将新更改的内容保存在缓冲区中。这些文件的大小可以从 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;
}