programing

재할당을 사용하여 할당된 메모리 축소

instargram 2023. 8. 10. 18:13
반응형

재할당을 사용하여 할당된 메모리 축소

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크기를 줄이려면:

  1. 구현은 할당된 메모리 블록을 요청된 새 길이로 분할하고 마지막에 사용되지 않은 부분을 해제합니다.
  2. 구현은 새 크기로 새 할당을 만들고 이전 내용을 새 위치에 복사한 다음 전체 이전 할당을 해제합니다.
  3. 이 구현은 전혀 도움이 되지 않습니다.

옵션 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

반응형