【问题标题】:How can I use Git's malloc wrapper in my code?如何在我的代码中使用 Git 的 malloc 包装器?
【发布时间】:2010-07-06 07:06:12
【问题描述】:

我想在我的代码中使用 git 的 malloc 和 realloc 包装器来应对 OOM(内存不足)情况。这是它的代码:

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;
}

但是 release_pack_memory 函数在 sha1_file.c 头文件中,并且该函数引用了 Git 代码中其他头文件中的函数,我不想花太多精力将这个函数与 Git 的代码库隔离。目前我正在寻找 release_pack_memory 函数的替代函数,或者你能推荐我另一个替代函数。我会感谢任何形式的帮助

【问题讨论】:

    标签: c git malloc


    【解决方案1】:

    为什么要使用 Git 的 malloc 包装器?你明白它在做什么吗?如果是这样,您为什么认为需要“替换” release_pack_memory?

    这个包装器所做的*是,如果malloc 失败,它会尝试释放一些用于缓存的内存(这是release_pack_memory 所做的),然后再试一次。如果你没有任何内存缓存,那么复制这个包装器真的没有意义(如果你确实有内存缓存,那么你应该已经知道如何从中释放内存而无需复制这个函数)。


    * 它还包含在不支持malloc(0) 的平台上检查size 是否为0,如果您担心,那么release_pack_memory 的东西仍然没用。

    【讨论】:

    • 是的,我以为我理解了这段代码。但我错过了它正在从自己的缓存中释放出来的点:)。而且我确实有内存缓存。
    • @systemsfault:当然,逻辑基本上只是“如果malloc 失败,则至少从缓存中释放size 字节并重试”。
    • 不,大小 0 检查不适用于不支持 malloc(0) 的平台。它适用于期望在 malloc(0) 上返回非 NULL 指针的愚蠢 GNU 行为的调用者。大多数理智的人都同意 malloc(0) 返回 NULL 是最好的。
    猜你喜欢
    • 2021-06-02
    • 1970-01-01
    • 2021-05-14
    • 2018-05-06
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 2012-03-01
    相关资源
    最近更新 更多