2012-01-30 2 views
23

2 차원 배열이 1 & 인 코드를 작성하고 있습니다. "오류 : 영역을 할당 할 수 없습니다"라는 메시지가 표시되며 너무 많은 메모리가 할당되어 있기 때문에 문제가 발생한다고 생각합니다. 나는 "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

+2

코드를 보여주십시오. – Pheonix

+0

당신이하는 일의 예를 제시해야합니다. 그렇지 않으면 당신의 질문은 지나치게 대답하기에는 너무 일반적입니다 : 사양을 읽으십시오. – akira

답변

32

malloc()을 사용하여 할당 된 메모리의 역순으로 할당 된 메모리가 free()이어야합니다.

할당 된 포인터를 사용한 후에 만 ​​메모리를 해제해야합니다.1 차원 배열에 대한

메모리 할당 : 1D 배열

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

메모리 해제 : 2 차원 배열

free(buffer); 

메모리 할당 :

double **cross_norm=(double**)malloc(150 * sizeof(double *)); 
    for(i=0; i<150;i++) 
    { 
     cross_norm[i]=(double*)malloc(num_items*sizeof(double)); 
    } 
,174 2 차원 배열에 대한

메모리 해제 : 아마도

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

    free(cross_norm); 
24

사실 C에서 메모리를 수동으로 "해제"할 수는 없습니다. 즉, 메모리가 프로세스에서 다시 OS로 릴리스된다는 것입니다. malloc()을 호출하면 기본 libc-runtime이 OS에서 요청합니다 메모리 영역. 리눅스에서는 mmap()과 같이 상대적으로 "무거운"전화가 걸릴 수도 있습니다. 이 메모리 영역이 프로그램에 매핑되면 할당 된 메모리 영역을 관리하는 "프리 스토어 (free store)"라고하는 연결된 목록 설정이 있습니다. malloc()으로 전화하면 요청 된 크기로 무료 메모리 블록을 무료로 보입니다. 그런 다음 원래 할당 된 메모리 풀에서 가져온 메모리 덩어리가 있음을 반영하도록 링크 된 목록을 조정합니다. free()에 전화 할 때 메모리 블록은 사용 가능한 메모리 덩어리를 나타내는 링크 된 목록 노드로 무료 저장소에 다시 배치됩니다.

무료 저장소에있는 것보다 더 많은 메모리를 요청하면 libc-runtime은 운영 체제에서 실행중인 프로세스에 메모리를 할당 할 수있는 한도까지 다시 메모리를 요청합니다. 메모리를 해제하면 다시 OS로 되돌아 가지 않습니다 ... 일반적으로 무료 저장소로 다시 재활용되어 malloc()이라는 또 다른 호출을 통해 다시 사용할 수 있습니다. 따라서 다양한 메모리 크기 요청을 사용하여 malloc()free()을 많이 호출하면 이론적으로 "메모리 조각화"라는 조건이 발생할 수 있습니다. 여기서 "메모리 조각화"는 무료 저장소에 요청 된 메모리 블록을 할당 할 충분한 공간이있을 수 있습니다 ,하지만 충분하지 않다. 인접한 요청한 블록 크기의 공간. 따라서 malloc()에 대한 호출이 실패하고 자유 저장소에 총 바이트 수로 사용 가능한 많은 메모리가 있더라도 효과적으로 "메모리 부족"상태가됩니다.

+2

그것은 나만인가, 아니면 OP가 뭔가 다른 것을 묻고 있으며 대답은 (비록 멋지게) 다른 것을 설명하고있는 것입니까? –

+3

OP는 내 대답을 입력 할 때 그의 질문을 업데이트했습니다. (일부 의견에 대한 답변으로 추측하고 있습니다 ...) 내 대답은 명시 적으로 업데이트 된 질문에 대답하지 않더라도 여전히 유익 할 것 같습니다. 그의 원래 질문에는 코드가 없으며 기본적으로 그는 'malloc'과 'free'를 사용하고 있지만 여전히 "지역을 할당 할 수 없다"라는 오류로 끝납니다. 가능한 메모리 조각화처럼 들리 더니 좋은 대답이라고 생각했습니다. – Jason

+0

아하이 봐요. 괜찮아. 변경된 질문을 통해 느낌이 좋지만 좋은 설명입니다. 어쨌든 당신은 내 +1을 가지고 있습니다. –

관련 문제