2014-02-15 89 views
0

因此,基本上我想使用malloc()函數在我的計算機上找到免費的Gb數(只是整個Gbs,忽略分數Gb)。這裏我們說我使用的代碼:使用malloc函數查找可用內存空間

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 

int main(int argv, char **argc) { 
    unsigned long size = 0; 
    void *part[1000]; 
    int i = 0; 

    part[size] = (void *)malloc(1024*1024*1024); 

    if(part[size] == 0) 
     printf("The computer has less than 1 Gb of free memory\n"); 
    else { 
     while((part[size] != NULL) && (size<1000)) { 
      size++; 
      part[size] = (void *)malloc(1024 *1024 *1024); 
     } 
     while(i <= size) { 
      free(part[size]); 
     } 
     printf("The computer has %luGb of free memory\n", size); 
    } 
    return 0; 
} 

結果是分段錯誤(核心轉儲),我真的不知道爲什麼出現這種情況,會很感激,如果任何人都可以指出我哪裏錯了。 謝謝:)

+1

請注意,由於[內存過量使用](https://www.google.co.uk/search?q=overcommit+memory),此方法不會告訴您有多少可用內存(至少不是在Linux上) )。 –

+1

沒有多少修復代碼可以使它做你想做的事情。什麼是真正的問題? –

+1

可能你想要http:// stackoverflow。com/questions/63166/how-to-determine-cpu-and-memory-consumption-from-inside-a-process – qwr

回答

2

由於您釋放了已釋放的內存,因此您正在收到分段錯誤。 更新你的第二個while環路

while(i <= size) { 
    free(part[i]); 
    i++; 
} 

正如評論所說,這不會給你多少空閒內存的系統上,因爲該操作系統分配的虛擬地址空間的過程中,沒有保證物理存儲它。這被稱爲內存過量使用。請在此處詳細閱讀 - What is Overcommit?

另外,您不應該使用malloc。如果忘記包含stdlib.h頭文件,則沒有任何好處,並且會導致錯誤。請閱讀Should I cast the result of malloc?

+0

我根據你說的改變,但現在我得到總線錯誤(核心傾倒)。任何建議? –

+0

它在我的系統上運行正常(Ubuntu 13.04 64位)並打印'計算機有1000GB的可用內存'。請再次檢查您的代碼並嘗試使用gdb進行調試。 – ajay

0

變化:

while(i<=size) 
    free(part[size]); 

要:

for (i=0; i<size; i++) 
    free(part[i]); 

順便說一句,我不認爲它會爲您免費GB的數量在您的計算機上,但數量分配給此進程的堆上的免費GB。

+0

假設當'size == 1000'時第一個'while'條件失敗,你還應該釋放'部分[大小]'。 – ajay

+0

是的,正確... –

0

下面的循環是無限的。循環沒有破壞條件。

while(i<=size){ 
    free(part[size]); 
} 

將其更改爲

long size = 0; //change to to long from unsigned long to make sure below loop would work. 


while(size >= 0){ 
    free(part[size]); 
    size--; 
} 
0

你的代碼寫過去的數組 「部分」 結束時,如果成功的malloc 1000倍。

你如何命名變量的方式非常混亂。大小是什麼大小?它根本不是一個大小。這是成功malloc'ed塊的數量。稱之爲:mallocedBlockCount。現在你知道它是什麼了,它使你的代碼更清晰,並且你的錯誤更加明顯。

這將顯而易見,大小實際上不是成功malloc'ed塊的數量,但少一個。結果,測試大小< 1000在沒有剩餘空間的地方成功。如果你的變量描述了它們包含的內容並且實際上與該描述相匹配,那麼這個錯誤就會很明顯

但實際上,整個方案並沒有給你任何有用的東西,因爲大多數操作系統會讓你分配大量的內存 - 只要你不使用它。如果使用太多,有些會崩潰,有些會放慢爬行速度。