C에서 메모리를 어떻게 해제합니까?
저는 1, 2차원 배열이 많은 코드를 작성하고 있습니다."오류: 영역을 할당할 수 없습니다"라는 오류가 발생했는데 메모리가 너무 많이 할당되어 있는 것 같습니다.저는 "malloc"과 "free" 기능을 사용하지만, 제가 제대로 사용하고 있는지 확신할 수 없습니다.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
기능?
당신은 해야 합니다.free()
할당된 메모리는 다음을 사용하여 할당된 방법의 정확한 역순으로malloc()
.
할당된 포인터를 사용한 후에만 메모리를 확보해야 합니다.
1D 어레이에 대한 메모리 할당:
buffer = malloc(num_items*sizeof(double));
1D 어레이에 대한 메모리 할당 취소:
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));
}
2D 어레이에 대한 메모리 할당 취소:
for(i=0; i<150;i++)
{
free(cross_norm[i]);
}
free(cross_norm);
실제로 C에서 메모리를 수동으로 "프리"할 수는 없습니다. 프로세스에서 OS로 메모리가 다시 해제된다는 점에서...malloc()
기본 libc-runtime은 OS에서 메모리 영역을 요청합니다.리눅스에서, 이것은 다음과 같은 비교적 "무거운" 호출을 통해 수행될 수 있습니다.mmap()
이 메모리 영역이 프로그램에 매핑되면 이 할당된 메모리 영역을 관리하는 "자유 저장소"라고 하는 연결된 목록 설정이 있습니다.전화할 때malloc()
요청된 크기로 무료 메모리 블록을 빠르게 검색합니다.그런 다음 원래 할당된 메모리 풀에서 메모리 청크가 제거되었음을 반영하도록 연결된 목록을 조정합니다.전화할 때free()
메모리 블록은 사용 가능한 메모리 청크를 나타내는 연결 목록 노드로 자유 저장소에 다시 배치됩니다.
빈 저장소에 있는 것보다 더 많은 메모리를 요청하면 libc 런타임은 실행 중인 프로세스를 위해 메모리를 할당하는 OS의 능력 한계까지 OS에 더 많은 메모리를 다시 요청합니다.하지만 메모리를 확보하면 OS로 반환되지 않습니다. 일반적으로 무료 저장소로 다시 사용됩니다. 여기서 다시 사용할 수 있습니다.malloc()
그러므로, 만약 당신이 많은 전화를 한다면.malloc()
그리고.free()
다양한 메모리 크기 요청으로 인해 이론적으로 "메모리 조각화"라는 상태가 발생할 수 있습니다. 즉, 자유 저장소에 요청된 메모리 블록을 할당할 수 있는 충분한 공간이 있지만 요청한 블록 크기에 대한 인접한 공간은 충분하지 않습니다.그래서 전화가 왔습니다.malloc()
오류가 발생하여 프리스토어에 총 바이트 양으로 사용할 수 있는 메모리가 충분하더라도 사실상 "메모리 부족" 상태가 됩니다.
언급URL : https://stackoverflow.com/questions/9069205/how-do-i-free-memory-in-c
'code' 카테고리의 다른 글
안드로이드 및 (이미지) 보기 알파에 대한 알파 (0) | 2023.09.10 |
---|---|
iOS에서 긴 작업을 실행할 때 "오버레이" 로드 (0) | 2023.09.05 |
jQuery $.ajax(), 성공 데이터를 별도의 함수로 전달 (0) | 2023.09.05 |
ER_PARSE_ERROR: SQL 구문에 오류가 있습니다. 사용할 올바른 구문은 MariaDB 서버 버전에 해당하는 설명서에서 확인하십시오. (0) | 2023.09.05 |
MariaDB 111 "연결 거부됨" (0) | 2023.09.05 |