메모리 영역
오늘 소개하는 동적 할당은 힙 영역에 관련된 이야기다.
우리는 여태 만든 변수들은 모두 스택 영역이나, 데이터 영역만 사용했다.
하지만, 프로그램이 실행되어야지만 알 수 있는 변수가 있을까?
예를 들어, 내가 엔터를 칠 때 마다 변수를 하나씩 생성하고 싶다면?
내가 엔터를 치지 않으면 하나도 생성되지 않을 것이고,
10번 엔터키를 입력한다면 10개의 변수가 생일 것이다,
이거, 가능할까?
동적인 메모리 할당
실행 중인 , 즉 런타임 도중 대응이 가능한 것을 동적 메모리 할당이라고 한다.
이는 코드에 선언하고, 프로그램 실행 전에 이미 만들어 놓은 변수들은
정적인 메모리 영역을 사용하기 떄문에 ,어떠한 변수도 힙 메모리 영역을 사용하지 못한다.
그럼 동적 할당은 어떻게 하나?
그래서 포인터라는 개념이 필요하다.
malloc함수
int a = malloc(100);
malloc함수는 괄호 안의 숫자의 바이트 크기만큼 힙 영역에 메모리를 할당하고, 그 시작주소값을 리턴해주는 함수이다.
즉, malloc함수가 할당한 것은 힙영역의 메모리 공간 뿐이다.
그리고 그 주소를 받은 친구가 변수가 될 것이다.
int* pInt = (int*)malloc(100);
그럼 이 코드는
100바이트의 메모리를 할당하고, 그 시작주소를 int형 포인터로 바꿔서,
그 값을 int형 포인터인 PInt에 넣은 것이다.
malloc함수의 리턴 자료형은 void이기에 int로 바꿔 준 것이다.
float* pfloat = (float*)malloc(100);
malloc은 공간을 할당하고 주소를 가져와 주는 것 이상의 역할을 하지 않는다.
그 공간을 어떤 포인터를 이용해여 사용할지는 꼭 설정해 주어야 한다.
동적 할당의 특징
1.런타임 중에 메모리 대응 가능
2.메모리를 내가 직접 할당해 주었다면, 해제도 내 손으로!
-스택, 데이터 영역을 사용하는 변수들의 경우, 이미 컴퓨터가 계산해서 그 크기만큼,
프로그램 실행 전 계산되어 할당하고, 해제하게 된다.
즉,이미 결정난 부분에 대해서 굳이 사용자가 신경써줄 필요가 없는 것이다.
-근데 그 역할을 사용자가 직접 해야되는 것이다.
free
int* pInt = (int*)malloc(100);
free(pInt);
free함수는 입력받은 포인터가 가리키는 주소의 힙메모리를 해제시키는 역할을 한다.
지역변수,전역변수 등의 힙영역 메모리가 아닌주소를 넣으면 큰 일 난 다!
pInt 변수가 해제되는 것이 아니라 그 안의 주소 영역을 해제한 것이다!!
메모리 정리를 안하면??
메모리는 계속 할당되고, 해제를 해주지 않는다면, 운영체제의 특별한 도움을 받지 않는 이상,
메모리 부족 현상으로 이어진다.
그래서 옛날 컴퓨터들은 오려 켜두거나, 바이러스에 감염 시 "시스템 메모리 부족" 이라는 경고가 나왔다.
'프로그래밍 언어 > C++ [기본]' 카테고리의 다른 글
[C++기본] 28.연결 리스트 (0) | 2021.09.26 |
---|---|
[C++기본] 27.가변 배열 (0) | 2021.09.23 |
[C++기본] 25.구조체 포인터 (0) | 2021.09.23 |
[C++기본] 24.문자열-5 (0) | 2021.09.23 |
[C++기본] 23.문자열-4 (0) | 2021.09.23 |