본문 바로가기
컴퓨터 공학/C, C++

[ C ] 메모리 이해하기9 _realloc()의 메모리 누수 문제, 해결책은?

by hahehohoo 2020. 7. 16.
반응형

 

C언어 메모리 이해하기9 _realloc()의 메모리 누수 문제 / 해결책 / malloc() + memcpy() +free()

 

 

먼저 realloc() 함수 개념을 이해하려면 이전 글을 읽어보세요.

realloc() 함수란?

 

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

 

realloc() 에서는 메모리 누수가 날 수 있습니다.

 

메모리 누수가 생기는 예
void* nums;
nums = malloc(SIZE);
nums = realloc(nums, 2 * SIZE); //NULL 반환

 

위 경우 nums에 원래 저장되어 있던 주소가 사라집니다.

NULL이 반환되었다는 것은 재할당에 실패했다는 뜻이고, 기존 메모리 역시 해제되지 않은 상태입니다.

이 상황에서 주소는 이미 잃어버렸으니 해제할 수 없습니다. -> 메모리 누수 발생

 

올바른 재할당 예
void* nums;
void* tmp;

nums = malloc(SIZE);
tmp = realloc(nums, 2 * SIZE); // 임시 변수에 주소 저장하기
if( tmp != NULL) {
  nums = tmp;
}

 

새로 할당한 주소를 tmp라는 임시 변수에 저장하고 NULL 값인지 확인한 다음에 데이터를 처리하면 안전합니다.

 

 

 

 


 

 

realloc() 함수는

malloc() + memcpy() + free()의 조합으로 대체할 수 있습니다.

차이는 realloc 함수는 원래 메모리 주소를 보장할 수도 있다는 점입니다. 

 

malloc() + free() + memcpy()
void* nums;
void* tmp;

nums = malloc(LENGTH);

tmp = malloc(2 * LENGTH);
if ( tmp != NULL) {
   memcpy(tmp, nums, LENGTH);
   free(nums);
   nums = tmp;
}
free(nums);

 

 

■ memcpy()

void* memcpy(void* dest, const void* src, size_t count);

 

src의 데이터를 count 바이트 만큼 dest에 복사하는 함수입니다. 

<string.h>에 있습니다.

다음과 같은 경우에는 결과값을 구할 수 없습니다.

- dest의 영역 뒤에 데이터를 복사할 경우(소유하지 않은 메모리에 쓰기)

- src나 dest가 널 포인터일 경우(널 포이터 역참조)

 


 

■ memcmp()

int memcmp(const void* lhs, const void* rhs, size_t count);

 

 첫 count 바이트 만큼의 메모리를 비교하는 함수입니다.

 strcmp()와 매우 비슷하지만 NULL 문자를 만나면 계속 진행합니다.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                

 

다음의 경우 결과가 정의되지 않습니다. 

- 1hs과 rhs의 크기를 넘어서 비교할 경우(소유하지 않은 메모리에 쓰기)

- lhs이나 rhs이 널 포인터일 경우(널 포이터 역참조)

 

 

 

 

 

-----------------------------------

C언어 문법 총정리

목록 보러가기 

-----------------------------------

 

 

 

 

반응형


댓글