2015년 7월 27일 월요일

20150728 메모리관리와 메모리의 동적 할당(Dynamic Memory Allocation)

컴파일러마다 메모리 구성이 다름

★heap영역은 운영체제(OS)가 제공하고 프로그램이 요구하는 메모리의 양만큼 할당
프로그램이 종료시 메모리를 돌려주기 전까지 다른 프로그램이 사용 못하도록 락걸림!
요즘에는 프로그램이 종료되면 운영체제에 의해서 전부해제되나 안되는것도 있다!

★운영체제가 heap영역메모리를 프로그램에 할당할때 처음 한번만 할당된 메모리 주소를
가르쳐주기에 포인터로 받아온 주소를 가리킬때 이 주소를 잃어버리지 않도록 해야한다!

☆Static(정적)-heap영역만 Dynamic(동적)
☆힙 영역의 메모리 공간 할당과 해제 : malloc(memory allocation)과 free 함수
void *malloc(size_t size); // 힙 영역으로의 메모리 공간 할당-초기화가 안되있어 쓰레기값
void free(void *ptr); // 힙 영역에 할당된 메모리 공간 해제
//malloc 함수는 성공 시 할당된 메모리의 주소 값, 실패 시 NULL 반환

void *ptr1 = malloc(4); // 4바이트가 힙 영역에 할당
free(ptr1); // ptr1이 가리키는 4바이트 메모리 공간 해제

☆malloc 함수의 반환형이 void형 포인터인 이유와 힙 영역으로의 접근
int *ptr = (int *)malloc(sizeof(int)); // int형 변수 크기의 메모리 공간 할당
위와같이 void형으로 반환되는 주소 값을 적절히 형 변환해서 할당된 메모리 공간에 접근!

calloc 함수 = 0으로 초기화 되어있음, malloc으로 구현가능
void *calloc(size_t elt_count, size_t elt_size);
// 성공시 할당된 메모리의 주소 값, 실패시 NULL 반환

★힙에 할당된 메모리 공간 확장 시 호출 : realloc
void realloc(void *ptr, size_t size); // 주소값이 변경되는 경우가 있음!
// 성공시 할당된 메모리의 주소 값, 실패시 NULL 반환
int *arr = (int *)malloc(sizeof(int)*3); // 길이가 3인 int형 배열 할당
arr = (int *)realloc(arr, sizeof(int)*5); // 길이가 5인 int형 배열로 확장

댓글 없음:

댓글 쓰기