我正在調試C程序。需要一個包含三維數據的龐大數據數組。我爲內存分配/免費開發了兩個函數。我的C代碼爲多維數組動態內存分配/免費有什麼問題
mm()
是專爲分配而設計的,參考一個數組記錄每個維度的大小(你可以在main()
中看到它)。 ff()
用於釋放內存。
我在fr()
執行後用top命令測試了我的代碼。它顯示內存沒有被釋放。 任何人都可以闡明它嗎?
在此先感謝!
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
28338 fsdiag 25 0 165m 164m 1208 R 63.2 26.0 0:00.33 a.out
3439 root 15 0 31740 1180 21m S 1.9 0.2 10:56.47 X
int main(){
unsigned char ***arr;
int dim_len[4]={8832,256,64,0}; // for 3-D array, 0 is mark of tail
unsigned char *p;
mm(&p, dim_len, 0); arr = (unsigned char ***)p;
ff((unsigned char **)&arr, dim_len);
while(1){}
return 0;
}
void mm( unsigned char **a,
int dim_len[], //dimension size array guarded by 0 in the tail
unsigned char data){ //preset data
if(*dim_len){
int i;
switch(*(dim_len+1)){
case 0://when allocate memory for unsigned char
*a = malloc(sizeof(unsigned char) * (*dim_len));
break;
default://when allocate memory for pointers
*a = malloc(sizeof(unsigned char *) * (*dim_len));
for(i=0; i<(*dim_len); i++){
mm((unsigned char **)&((*a)[i*4]), dim_len+1, data);
}
break;
}//end of switch
}//end of if
return;
}
void ff( unsigned char **a,
int dim_len[]){//dimension size array guarded by 0 in the tail
if(*dim_len){
int i;
switch(*(dim_len+1)){
case 0://when free memory for unsigned char
free(*a);
break;
default://when free memory for pointers
for(i=0; i<(*dim_len); i++){
ff((unsigned char **)&((*a)[i*4]), dim_len+1); //pointer needs 4 bytes storage
}
free(*a);
break;
}//end of switch
}//end of if
*a = NULL;
return;
}
如果你重用已經釋放之後的內存,並狀元秀使用更多內存?很多時候,'free'只是將釋放的內存標記爲可用;它不會將其返回到操作系統。 – pmg
請注意,由於本示例代碼中的數組維數在編譯時已知,因此您可以執行'typedef unsigned char twoD [256] [64]; twoD * p = malloc(8832 * sizeof(* p));'。但是在你真實的代碼中可能不是這種情況。 –