C언어 메모리 이해하기9 _realloc()의 메모리 누수 문제 / 해결책 / malloc() + memcpy() +free()
먼저 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, C++' 카테고리의 다른 글
[ C ] 메모리 이해하기11_동적 메모리의 소유권 문제 (398) | 2020.07.17 |
---|---|
[ C ] 메모리 이해하기10 _정적 vs 동적 메모리 (398) | 2020.07.17 |
[ C ] 메모리 이해하기8 _calloc(), memset(), realloc() (411) | 2020.07.16 |
[ C ] 메모리 이해하기7 _malloc 짝꿍 함수 free 란? (389) | 2020.07.16 |
[ C ] 메모리 이해하기6 _동적메모리란? / 동적 할당 개념 그림으로 이해하기 (395) | 2020.07.15 |
댓글