반응형
[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..
}
'C,C++ > C++' 카테고리의 다른 글
[C++] std::thread 생성에 대해 알아보자 (0) | 2020.06.26 |
---|---|
특정 문자로 문자열 분리하기 | tokenizer (0) | 2020.06.23 |
[C/C++] malloc과 new의 차이와 동작 원리 (0) | 2020.04.07 |
[C++] 스마트 포인터에 대해 알아보자(3) | 약한 포인터 | std::weak_ptr (0) | 2020.03.21 |
[C++] 스마트 포인터에 대해 알아보자(2) | 공유 포인터 | std::shared_ptr (1) | 2020.03.21 |
댓글