包装malloc – C.

我是C的初学者。在阅读git的源代码时,我发现了围绕malloc这个包装函数。

 void *xmalloc(size_t size) { void *ret = malloc(size); if (!ret && !size) ret = malloc(1); if (!ret) { release_pack_memory(size, -1); ret = malloc(size); if (!ret && !size) ret = malloc(1); if (!ret) die("Out of memory, malloc failed"); } #ifdef XMALLOC_POISON memset(ret, 0xA5, size); #endif return ret; } 

问题

  1. 我不明白为什么他们使用malloc(1)
  2. release_pack_memory做了什么,我在整个源代码中找不到这个函数实现。
  3. #ifdef XMALLOC_POISON memset(ret, 0xA5, size);是什么#ifdef XMALLOC_POISON memset(ret, 0xA5, size); 呢?

我打算在我的项目中重用这个function。 这是malloc的好包装吗?

任何帮助都会很棒。

  1. malloc(0)不适用于所有平台,在这种情况下,将进行单字节分配。 允许分配0长度的存储器块简化了程序的更高级逻辑。

  2. 不知道。

  3. 通过使用非零值填充分配的内存,更容易在没有正确初始化的程序中找到使用内存的程序中的错误:在这种情况下程序几乎会立即崩溃。 由于填充内存需要时间,因此它包含在预处理器定义中,因此仅在需要时才进行编译。

对于问题2:在sha1_file.c:570中找到release_pack_memory。

问题1:

该标准没有定义malloc(0)的行为。 这可能会返回一个有效的指针,或者它可能返回NULL。 不同的实现以不同的方式处理,因此代码回退到malloc(1)以获得一致的行为。

对于问题3:

它将缓冲区的内容设置为“奇怪”。 这样,您的代码有望不依赖于特定内容(malloc不保证)。

我不熟悉这个包装器,但这是它的function

1 – 如果指定了size = 0,那么如果底层malloc没有这样做,它将分配1个字节

这可能是为了让调用者仍可以免费使用它(如realloc)

2我假设它试图强制底层内存子系统看起来更难以寻找内存

3 XMALLOC_POISON强制缓冲到已知状态这是常见做法,以防止和检测由未初始化数据引起的奇怪错误

其次 – 为什么要包装malloc。 首先考虑您想要做什么,然后实现它或复制实现。 包装malloc的原因

  1. 泄漏检测
  2. 用法分析
  3. 内存池
  4. 调试(如XMALLOC_POISON)
  5. 强制检查

几乎所有这些都可以用valgrind来完成 – 这可以做得更多。

“编写固体代码”一书有很好的1,4和5的内存包装