1. malloc
return 타입이 void*인 void형 포인터이다.
동적할당을 하게될 경우 return할때의 자료형을 명시할 수 없기에 void 형 시작주소를 return 한다.
malloc은 단순히 void형 시작 주소를 반환하기에 우리가 필요한 자료형으로 아래와 같이 형변환해서 사용해주어야한다.
처음 malloc을 하게 되면 할당된 메모리를 초기화 하지않기에, 쓰레기값이 들어있다.
malloc 이후 memset 등을 이용하여 메모리 초기화를 시켜주어야한다.
2. calloc
return 타입이 malloc과 같은 void형 포인터이다.
동작방식이 매우 비슷하며, 입력 파라미터에 size_t num이 추가되어 있다. 동적 메모리 생성하는 개수를 추가해주어 사용한다.
다만 다른점이 있다면, malloc과 다르게 할당된 메모리를 0으로 초기화 한다.
3. realloc
malloc이나 calloc을 통하여 할당된 메모리의 공간을 더 늘리거나 줄이거나 할때 사용된다.
하지만 exception을 피하려면 필요한 공간만큼 메모리 할당이 되어있는지 확인을 해야한다.
아래를 참고해보자.
동적할당은 항상 메모리 해제가 가장 중요하다.
4. 주의사항
<메모리 할당이 실패할 경우>
realloc의 메모리 할당이 실패할 경우 반환값은 NULL로 반환된다.
그렇다면 기존에 동적할당되어있는 시작 주소를 잃어버리게 된다.
포인터를 잃어버리고 포인터가 가리키고 있던 배열은 여전히 힙 메모리에 남아서 메모리 누수를 발생시킨다.
아래는 참고 할 수 있는 메모리 이미지이다.
이러한 일을 사전방지를 하기 위해 기존의 메모리주소를 저장하고, 실패 시 복구 프로세스가 있어야합니다.
간단하게 설명하자면,
int* ptr = malloc();
ptr = realloc(); 인 코드가 있을 경우, realloc이 실패하게되면 free()를 시켜줄 수 없기에 메모리 누수가 생긴다.
물론 이 코드가 만약만약에 GUI를 update 해주는쪽이라면 순식간에 메모리가 터져서 프로그램이 종료되게 된다.
그래서 realloc 시 기존의 메모리 시작주소를 저장해놓고 복구 프로세스 코드를 함께 짜놓자.
'🔥 Programming > C++' 카테고리의 다른 글
[C/C++] C++ auto keyword의 장점과 단점 (0) | 2022.11.27 |
---|---|
[C/C++] C++ 벡터 사용시, () 선언과 [] 선언의 차이 (0) | 2022.10.14 |
[C/C++] C++ 배열 초기화 (std::fill_n, std::fill, memset) (0) | 2022.10.13 |
[C/C++] C++ ios_base::sync_with_stdio(false), cin.tie(0) (0) | 2022.08.19 |