在跳跃之前看

时间:2010-11-27 11:24:12

标签: c memory-management malloc

忽略多线程问题,以下保证可以正常工作:

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 个答案:

答案 0 :(得分:5)

没有。即使没有多线程,malloc调用也是从OS获取(内存)资源。通常(Windows,Linux,Mac等)操作系统可以在程序执行期间随时执行影响可用资源的操作。这意味着在您的支票和实际分配之间,内存可能会变得“无法使用”。

如果您对操作系统有异常完整的控制权,那么可能会使其变得强大 - 但这将非常棘手。

答案 1 :(得分:1)

上面的答案是正确的。在许多Linux版本上,它更糟糕,因为它使用乐观的内存分配。因此即使malloc()返回非null,它意味着内存确实可用。更多信息here