재할당을 사용하여 할당된 메모리 축소
C의 재할당 함수에 대한 간단한 질문: 재할당을 사용하여 포인터가 가리키는 메모리 블록을 축소하면 "추가" 메모리가 해제됩니까?아니면 어떻게든 수동으로 해제해야 합니까?
예를 들어, 제가 한다면요.
int *myPointer = malloc(100*sizeof(int));
myPointer = realloc(myPointer,50*sizeof(int));
free(myPointer);
메모리 누수가 있습니까?
아니요, 메모리 누수는 없을 겁니다.realloc
나머지를 단순히 미래를 위해 "사용 가능"으로 표시할 것입니다.malloc
작전
하지만 당신은 여전히 해야 합니다.free
myPointer
나중에별도로, 만약 당신이 사용한다면.0
의 크기로realloc
와 같은 효과를 낼 것입니다.free
일부 구현에 대해 설명합니다.스티브 제섭과 R.댓글에 기대면 안 돼요.
확실히 메모리 누수는 없지만, 전화를 걸 때 최소 3가지 중 하나라도 발생할 수 있습니다.realloc
크기를 줄이려면:
- 구현은 할당된 메모리 블록을 요청된 새 길이로 분할하고 마지막에 사용되지 않은 부분을 해제합니다.
- 구현은 새 크기로 새 할당을 만들고 이전 내용을 새 위치에 복사한 다음 전체 이전 할당을 해제합니다.
- 이 구현은 전혀 도움이 되지 않습니다.
옵션 3은 다소 좋지 않은 구현이지만 완벽하게 합법적입니다. 나중에 전화를 걸면 전체가 여전히 해제되기 때문에 "메모리 누수"는 없습니다.free
그 위에
옵션 1과 2의 경우 성능을 선호하는지 아니면 메모리 조각화를 피하는지에 따라 어느 것이 더 낫습니다.대부분의 실제 구현은 옵션 1을 수행하는 쪽으로 기울 것이라고 생각합니다.
재할당이 실패해도 새 코드는 원래 할당을 계속 누출합니다.대부분의 구현은 블록을 축소하는 데 실패하지 않을 것으로 예상되지만, 허용됩니다.블록을 늘리거나 줄이거나 재할당을 호출하는 올바른 방법은 void *tmp = realloc(myPointer, 50*sizeof(int))입니다. (!tmp) { /* 어떻게든 오류를 처리합니다. myPointer는 여전히 */ } myPointer = tmp;스티브 제섭이 48분 전에
저기, 당신의 댓글에 어떻게 답해야 할지 모르겠어요, 미안해요.
내 포인터 유형에 tmp를 캐스팅해야 합니까?이 경우에는 다음과 같이 적어야 합니까?
myPointer = (int*)tmp
또한, 이 경우에, 내가 자유를 할 때 (나의 포인터)tmp로 가리키는 메모리도 해방되는 거죠?그래서 할 필요가 없습니다.
free(myPointer)
free(tmp)
당신이 코드를 준 방식으로, 네, 누출이 있을 수 있습니다.의 realloc
의 새 할 수 ."라는 메시지가 표시됩니다.에서 하는 처럼, 은 그 .realloc
당신을 보냅니다.
int *myPointer2 = realloc(myPointer,50*sizeof(int));
assert(myPointer2);
myPointer = myPointer2;
재할당()을 위한 프로세스는 먼저 이전 메모리 블록을 할당한 다음 다시 할당하는 것이라고 생각합니다(대학 선생님이 말씀하셨습니다).이 상태가 계속 유지된다면 추가로 50바이트를 이미 확보했을 것입니다.또한 100바이트 메모리에 데이터가 있는 경우 재할당된 50바이트 메모리에 할당되어 데이터가 손실될 수 있습니다.그래서 메모리 누수가 없어야 합니다.
언급URL : https://stackoverflow.com/questions/7078019/using-realloc-to-shrink-the-allocated-memory
'programing' 카테고리의 다른 글
요소에 동일한 폭을 제공하지 않는 Flexbox (0) | 2023.08.10 |
---|---|
MariaDB를 시작하고 센토스 기반 도커 이미지를 계속 실행하는 방법. (0) | 2023.08.10 |
도커의 이미지를 삭제하려면 어떻게 해야 합니까? (0) | 2023.08.10 |
아이폰에서 빈 영역을 터치했을 때 키보드를 숨기는 방법 (0) | 2023.08.10 |
스프링 셸을 사용하여 스프링 부트 웹 애플리케이션에서 콘솔 명령을 빌드하는 방법은 무엇입니까? (0) | 2023.08.10 |