내용 출처 : YES C (정보공학연구소 /생능출판사)
혼자 연구하는 C/C++ (SoEn.kr /와우북스)
Ⅰ. 정적 할당(Static Allocation)과 동적 할당(Dynamic Allocation)
① 정적 할당은 프로그램을 작성할 때 필요한 메모리양을 미리 알려주어 컴파일러가 그 만큼 메모리를 할당하는 것을 말한다.
② 대부분의 변수들은 선언시 이러한 정적 할당의 방법으로 할당되며 배열도 그러하기에 배열의 크기에는 상수값만 올 수 있다.
③ 하지만 프로그램 작성시에는 메모리가 얼마나 필요한지 전혀 알 방법이 없을 때도 있다.
④ 이럴때 사용하는 방법이 동적할당으로 이는 프로그램 실행중에 필요한 만큼의 메모리를 할당하는 것을 의미한다.
Ⅱ. 메모리 관리 원칙
① 현재의 32비트 이상의 시스템에서는 응용프로그램이 직접 메모리 영역에 접근하는 것이 금지되어 있다.
② 메모리 영역에 직접 읽고 쓰는 것은 운영체제의 고유역할로 응용 프로그램은 필요한 메모리를 운영체제로부터 할당받아야만 쓸 수 있다.
③ 운영체제는 사용가능한 메모리가 남아있는 한 응용 프로그램의 할당 요구를 거절하지 않는다.
④ 한번 할당된 메모리 공간은 절대로 다른 목적으로 재할당되지 않는다.
⑤ 그러므로 응용프로그램은 할당받은 메모리를 다 쓰고 반납하기 전까지 독점적으로 사용할 수 있다.
⑥ 운영체제는 반납된 메모리를 빈 공간으로 인식하고 다른 목적의 할당 요청이 들어오면 내어주게 된다.
⑦ 메모리의 실체는 컴퓨터에 설치되어 있는 RAM이므로 무한하지 않으며 그렇기 때문에 다 사용한 메모리는 꼭 반납되어야 한다.
⑧ 그러지 않고 사용하지도 않는 메모리를 반납하지 않고 갖고 있는 상황을 '메모리 누수가 일어나고 있다'고 칭한다.
Ⅲ. 정적 영역, 동적 영역, 스택
① 전역 변수와 static 변수는 메모리의 정적 영역에 위치하며 프로그램이 종료될 때까지 반납되지 않는다.
② 지역 변수는 메모리의 스택 영역에 위치하며 변수의 통용 범위가 끝나면 자동으로 반납된다.
③ 동적 영역은 동적 할당된 메모리가 할당되는 영역이다.
④ 동적 할당은 프로그램 실행 중 할당되는 메모리로 얼마나 필요한지도 언제까지 필요한지도 모른다.
⑤ 그러므로 동적 할당한 메모리는 해제도 직접하지 않으면 위의 원칙에 따라 독점적으로 할당된 상태로 유지된다.
⑥ 이때 동적 할당된 메모리는 이름없는 메모리이므로 꼭 포인터로 받아서 사용해야한다.
Ⅳ. C에서의 할당 방법과 해제 방법
① 할당시 : void* malloc(size_t size ); 해제시 : void free(void* memblock ); (헤더파일 stdlib.h 필요)
② 10바이트가 필요하면 malloc(10), int형 데이터 10개를 저장할 공간이 필요하면 malloc(sizeof(int)*10)으로 할당할 수 있다.
③ malloc함수는 void*를 리턴하므로 넘길때 받는 포인터의 타입으로 캐스팅해줘야한다.
ex) int* ip = (int*) malloc(sizeof(int) * 10)
④ 해제는 동적할당 받은 메모리를 주소를 저장하고 있는 포인터로 한다.
ex) free(ip)
// 동적할당은 사실 포인터때 다뤘어야 했는데 ... 책에서 제대로 설명안하고 이제서야 살짝 나와서 여기서 다룸.