2015-07-12 250 views
-6

成功時的malloc函數返回指向分配的內存位置的指針,並在失敗時返回空值。如果我把malloc()放在一個無限循環中,這個循環會停止嗎?在malloc()分配完整的內存之後,它會停止執行還是繼續返回空值?在無限循環中運行malloc()

+5

你嘗試過會發生什麼? –

+3

你試過了嗎? (你應該!) – Amit

+1

@apoorvasomani那麼/爲什麼你問這個問題呢? –

回答

3

在Linux上,就像在銀行。進程可以共同借用比可用的更多的東西,但是除非他們嘗試使用它,否則它們是可以的。只有這樣內核才能用真實內存(或一塊交換分區)來備份它。如果所有的真實內存和交換分區都用盡了,內核應該運行OOM(內存不足殺手)並首先得到罪魁禍首。

如果我只是不malloc試圖使用它,內核可以讓我的生活,但我通過malloc開始越來越空值:

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char **argv) 
{ while(1){ printf("%lu\n",(long unsigned)malloc(1024*1024*1024)); } } 

輸出:

140725756837904 
140724683091984 
140723609346064 
140722535600144 
0 
0 
0 
0 
0 
0 
... 

僅憑這一點不會導致交換任何東西,因爲我只是得到(可能無法實現的)內存承諾,並且它沒有被真實內存備份,直到我通過嘗試使用那些返回的指針來執行內核來保持內核的承諾。

4

以這種方式重複調用malloc將永遠持續返回空指針。 (但是,如果你嘗試使用空指針,你當然會得到一個段錯誤)。

這與C++中new的行爲不同,如果它不能分配新內存,則拋出bad_alloc

+0

取消指針NULL指針通常傾向於這樣做,無論它們如何獲得。 :d – PSkocik