代码之家  ›  专栏  ›  技术社区  ›  Chris Lutz

先看后跳

  •  2
  • Chris Lutz  · 技术社区  · 14 年前

    忽略多线程问题,是否保证以下功能正常工作:

    int can_alloc(size_t i)
    {
        void *p = malloc(i);
        if(p == NULL) return 0;
        free(p);
        return 1;
    }
    
    // later
    if(can_alloc(10))
    {
        char *c = malloc(10); // no need to verify, we already did?
        memcpy(c, "something", 10);
    }
    

    这主要是出于好奇。我没有计划用它做任何事情,但我相信它应该是有保证的,而且它肯定会提供信息。

    2 回复  |  直到 14 年前
        1
  •  5
  •   sje397    14 年前

    不,即使没有多线程, malloc 调用正在从操作系统获取(内存)资源。通常情况下(Windows、Linux、Mac等),操作系统可以在程序执行期间随时执行影响可用资源的操作。这意味着在检查和实际分配之间,内存可能变得“不可用”。

    如果你有 异常完整 对操作系统的控制,那么就有可能使它变得强大——但这将是非常棘手的。

        2
  •  1
  •   John Sloper    14 年前

    以上答案是正确的。在许多Linux版本上,由于使用乐观内存分配,情况更糟。所以即使 malloc() 返回非空值 意味着内存是可用的。更多信息 here .