跳躍

2010-11-27 113 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