C 프로그램을 디버깅하는 중입니다. 3 차원의 거대한 데이터 배열이 필요합니다. 메모리 할당/해제를위한 두 가지 기능을 개발했습니다.동적 메모리 할당에 대한 내 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;
}
위에 더 많은 메모리를 사용할 보여 않습니다, 다음은 바로 해방 후
ps
직전 의 출력은? 아주 자주,'free'는 해제 된 메모리를 사용할 수 있다고 표시합니다. OS로 반환하지 않습니다. – pmg이 예제 코드의 배열 크기는 컴파일 타임에 알려 지므로 'typedef unsigned char twoD [256] [64]; twoD * p = malloc (8832 * sizeof (* p));'. 하지만 실제 코드에서는 그렇지 않을 수도 있습니다. –