【问题标题】:Realloc Memory InterceptRealloc 内存拦截
【发布时间】:2019-02-21 22:00:24
【问题描述】:

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

【问题讨论】:

  • 很遗憾,由于星座,无法进行调试 -- 什么?
  • 我想你的意思是memoryused += contenlength
  • 我正在使用 API,需要在程序中打开文件,无法调试。
  • 崩溃怎么办?听起来您可能遇到了过度使用的问题。您可以捕获信号并打印其详细信息...
  • @o11c 那是API和程序的问题。我无法在任何地方发现错误并看到工作。有时我会在错误日志中收到以下消息。 (页面保护错误)在偏移量 1: 00001F70 [sys]

标签: c memory realloc


【解决方案1】:

如果您阅读了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;
}

【讨论】:

  • 感谢您提供的信息。我接受并实施了您的建议。即使我的问题仍然存在,我的问题也得到了解答。但错误可能在其他地方。
  • 注意:如果分配的内存量为零,new_ptr == NULL 不是一定的内存不足情况。
  • @chux 我没听懂你。你的意思是比new_ptr == NULL 需要更多的检查,还是NULL return 并不总是意味着错误?
  • "如果无法分配空间,则返回空指针。如果请求的空间大小为零,则行为由实现定义:要么返回空指针,要么行为为就好像大小是某个非零值一样,除了返回的指针不应用于访问对象。” §7.23 1
  • @chux 非常好。我将在示例中添加必要的 cmets 以显示假设。
猜你喜欢
  • 1970-01-01
  • 2018-03-05
  • 2015-11-22
  • 2011-05-31
  • 1970-01-01
  • 2013-06-25
  • 2018-08-09
  • 1970-01-01
  • 2012-11-04
相关资源
最近更新 更多