본문 바로가기
C,C++/C++

[C/C++] realloc 함수 사용 시 주의할 점

by woohyeon 2020. 4. 9.
반응형

[realloc]
realloc 함수는 malloc을 통해 할당된 메모리의 크기를 축소하거나 확장하고 싶을 때 사용한다.

[realloc 사용 시 주의사항]

void* realloc(void* ptr, size_t size);


1. realloc은  ptr이 가리키는 메모리 주소의 크기를 size 바이트로 확장 또는 축소한다. 만약 size바이트 만큼 연속된 메모리를 할당할 수 없을 경우 새로운 영역을 할당 후 기존 요소들을 복사하여 새 메모리 주소를 반환한다. 따라서 항상 ptr이 이전의 주소값과 일치한다고 말할 수 없다. 

2. realloc은 size가 0이거나 size바이트만큼 할당할 수 없다면 ptr은 그대로 살려둔채로 NULL을 반환한다. 보통 realloc을 다음과 같이 사용하는데, 이 경우 기존 ptr이 사라지면서 힙 영역에 할당된 메모리 주소를 잃어버리게 된다. 따라서 메모리 누수가 발생한다. 즉 다음 코드에서 realloc에 실패하면 buffer는 기존 주소를 잃어버리게 된다. 따라서 기존 주소를 백업해두는 루틴이 필요하다.

void ReallocExample()
{
   char* buffer = (char*)malloc(4);
   buffer = (char*)realloc(buffer, 8);
}

 

아래 예제는 기존 주소를 안전하게 임시 공간에 백업해두고 realloc을 수행한다. 만약 할당 실패 시 프로그램을 종료한다면 메모리를 해제해준다.

void ReallocExample()
{
   // malloc 조건문은 생략
   char* buffer = (char*)malloc(4);
   
   // buffer 백업
   char* backupBuffer = buffer;
   
   if( NULL == (buffer = (char*)realloc(buffer, 8)) )
   {
      // 종료 시
      free(backupBuffer);
      fprintf(stderr, "Memory allocation is failed");
      exit(1);
      
      // 프로그램 계속 진행할 시 주소 복구
      // buffer = backupBuffer;
   }
   
   // Do something..
}



댓글