동적할당
정적 : 프로그램 시작하기 이전에
동적 : 프로그램이 구동하고 있는 중.
프로그램이 구동 중일 때 메모리 사용 허가를 받겠다! 하는 것이 동적 할당임.
힙 영역 메모리 : 프로그램 구동 중에 동적할당이 가능함!
C언어 동적 할당 문법 반드시! 포인터가 필요하다!
int main(){
// malloc, calloc
int * p = malloc(4); X
int * p = (int*)malloc(4); O - 반드시 명시적 형변환
*p = 100;
cout << (*p) << endl;
int * p = (int*)malloc(sizeof(int) * 4); O - 반드시 명시적 형변환
}
malloc은 void* (보이드 포인터형)을 반환하는 함수, void * 는 어떤 타입의 주소인지 모르는 경우 사용함. void * 을 사용할 때 어떤 자료형의 주소 형식인지 ‘반드시’ 명시적 형변환을 해야함.
malloc은 할당한 heap영역의 첫번째 주소를 반환함. 힙 영역의 주소는 변수로 호출할 수 없기에, 반드시 포인터를 쓰는 것임.
int* p = (int*)malloc(16);
for(int i=0; i < 4; ++i){
p[i] = i+1;
} //동적 배열과 유사
int* pArray = (int*)calloc(4, sizeof(int));
동적 배열을 만들 때 굉장히 편해지는 것. calloc을 하게 되면 할당받은 heap공간의 배열이 자동으로 0 초기화가 됨.
메모리 반환
void free(void * ptr)
int* p = (int*)malloc(4);
free(p);
heap영역의 ‘사용권한’을 반납하는 함수. (p가 가리키는 주소는 같음. 심지어 free하고도 주소로 접근하여 읽고 쓰기 가능함.) 즉, 댕글링 포인터 출현 ( : 주소의 사용 권한이 없음에도 포인터여서 사용의 문제를 야기할 수 있는 포인터.)
p = null;
그렇기에 주소를 반드시 null로 변환을 해주어야 함.
C++문법 기반의 동적할당.
int * p = new int;
new 연산자 : heap 영역에 메모리를 할당해주는 연산자.
동적할당과 동시에 초기화를 시킬 수 있게 되었다.
int *p = new int(100);
동적 배열을 만드는 법.
int* pArray = new int[4];
int* pArray = new int[4]{}; //할당과 동시에 초기화
메모리의 반환 : delete
delete p; //메모리의 반환.
→ 반환 후에 p의 값은 알지 못하는 주소로 바뀌게 되었다. 다만, 마찬가지로 접근해서 사용해서는 안되는 주소인 것은 마찬가지이기 때문에 끝난 후 nulptr 초기화가 반드시 필요함.
NULL = 0(리터럴) nulptr = 포인터 초기화
동적 배열의 반환
delete pArray; // 이건 아님.
delete []pArray //이렇게 사용하는 것이 맞음.
C++에서 동적 배열을 메모리에서 반환 할 시 [] 연산자를 앞에 기입해야 한다.