2012-01-30 104 views
23

我正在寫代碼,它有很多2維數組。我得到了「錯誤:無法分配區域」,我認爲它是因爲分配的內存太多。我使用「malloc」和「free」函數,但我不確定我是否正確使用它們。也許你知道我在哪裏可以看到有關C語言內存管理的好例子?如何在C中釋放內存?

所以..我只是試圖讓一個算法的工作,現在這個代碼功能後,只是功能..

//memory allocation for 1D arrays 
buffer = malloc(num_items*sizeof(double)); 

//memory allocation for 2D arrays 
double **cross_norm=(double**)malloc(150 * sizeof(double *)); 
for(i=0; i<150;i++) 
    { 
     cross_norm[i]=(double*)malloc(num_items*sizeof(double)); 
    } 

    //code 
Window(N, window_buffer); 
STFTforBMP(buffer,N,f, window_buffer); 
getMagnitude(buffer,f, N, magnitude); 
calculateEnergy(flux,magnitude, f); 
calculateExpectedEnergy(expected_flux, candidate_beat_period, downbeat_location, f); 
calculateCrossCorrelation(cross, flux, expected_values, f); 
findLargestCrossCorrelation(&cross_max, cross, f); 
normalizeCrossCorrelation(cross_norm, &cross_max, cross, f); 
    ............... 

我應該如何使用free功能?

+6

也許這將是更有建設性的向我們展示你嘗試過什麼? – cnicutar 2012-01-30 18:59:45

+2

顯示您的代碼。 – Pheonix 2012-01-30 19:00:06

+0

你應該提供你做什麼的例子。否則你的問題太籠統了,無法回答:閱讀規格。 – akira 2012-01-30 19:00:41

回答

32

您必須按照與使用malloc()分配方式完全相反的順序分配內存free()

請注意,只有在完成分配指針的使用後,才應該釋放內存。

爲一維數組的存儲器分配:對於一維數組

buffer = malloc(num_items*sizeof(double)); 

內存釋放:

free(buffer); 

用於2D陣列的存儲器分配:

double **cross_norm=(double**)malloc(150 * sizeof(double *)); 
    for(i=0; i<150;i++) 
    { 
     cross_norm[i]=(double*)malloc(num_items*sizeof(double)); 
    } 

二維數組內存釋放:

for(i=0; i<150;i++) 
    { 
     free(cross_norm[i]); 
    } 

    free(cross_norm); 
24

實際上,您不能在C中手動「釋放」內存,這意味着內存將從進程釋放回操作系統......當您調用malloc()時,底層libc運行時會向操作系統請求一個內存區域。在Linux上,這可以通過像mmap()這樣的相對「重」的調用完成。一旦這個內存區域映射到你的程序,就會有一個鏈接列表設置,稱爲「free store」,用於管理這個分配的內存區域。當您撥打malloc()時,它會盡快查看免費存儲空間以獲取所需大小的空閒內存塊。然後調整鏈表以反映從最初分配的內存池中取出了一塊內存。當您撥打free()時,內存塊將作爲鏈接列表節點放回空閒存儲區,指示其可用內存塊。

如果您請求的內存超過free-store中的內存,libc-runtime將再次從操作系統請求更多內存,直到操作系統爲運行進程分配內存的能力的限制。當你釋放內存時,它不會返回到操作系統......它通常會被循環回到免費商店,在那裏它可以被另一個電話malloc()再次使用。因此,如果您對malloc()free()進行了大量調用,請求的內存大小不一致,理論上它可能會導致一種稱爲「內存碎片」的情況,其中空閒存儲中有足夠的空間來分配請求的內存塊,但沒有足夠的連續的空間爲您請求塊的大小。因此,對malloc()的調用失敗,並且即使在免費商店中可能有足夠的可用內存作爲字節總數,您也實際上「內存不足」。

+2

這只是我還是OP在問一些不同的東西,答案(雖然很好)解釋了別的東西? – 2012-01-30 19:31:20

+3

OP更新了他的問題,因爲我正在鍵入我的答案(我在迴應一些評論時猜測)......我認爲即使它沒有明確回答他更新的問題,我的答案也可能具有啓發性。他原來的問題沒有代碼,基本上他使用'malloc'和'free',但仍然以「無法分配區域」錯誤結束。它聽起來像是可能的內存碎片,所以我認爲這可能是一個很好的答案。 – Jason 2012-01-30 19:40:08

+0

啊我明白了。好的。這是一個很好的解釋,雖然改變後的問題使它感覺不合適。反正你有我的努力+1。 – 2012-01-30 19:43:38