跳跃

2010-11-27 112 views
2

忽略多线程问题之前看,是以下保证工作:跳跃

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

这主要是出于好奇。我没有计划将它用于任何事情,但我相信它应该保证能够工作,并且确实知道这些信息。

回答

5

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

如果您有异常完成操作系统的控制,那么它可能会使这种健壮 - 但它会非常棘手。

+0

我认为(在大多数操作系统中)每个进程只有相当数量的内存分配给该进程。 – 2010-11-27 11:30:55

+0

我从来没有听说过。我认为他们只是分配了他们要求的东西(可能四舍五入为大块)。 – sje397 2010-11-27 11:33:15

1

上面的答案是正确的。在许多Linux版本中,它更糟,因为它使用乐观的内存分配。因此,即使malloc()返回非空,它确实而不是表示内存真的可用。更多信息here