더듬이의 헬로월드

Hello, World!

프로그래밍 언어/C++ [기본]

[C++기본] 26.동적 할당

더듬이 2021. 9. 23. 19:10
728x90

메모리 영역

오늘 소개하는 동적 할당은 힙 영역에 관련된 이야기다.

우리는 여태 만든 변수들은 모두 스택 영역이나, 데이터 영역만 사용했다.

하지만, 프로그램이 실행되어야지만 알 수 있는 변수가 있을까?

예를 들어, 내가 엔터를 칠 때 마다 변수를 하나씩 생성하고 싶다면?

내가 엔터를 치지 않으면 하나도 생성되지 않을 것이고,

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 변수가 해제되는 것이 아니라 그 안의 주소 영역을 해제한 것이다!!

메모리 정리를 안하면??

메모리는 계속 할당되고, 해제를 해주지 않는다면, 운영체제의 특별한 도움을 받지 않는 이상,

메모리 부족 현상으로 이어진다.

그래서 옛날 컴퓨터들은 오려 켜두거나, 바이러스에 감염 시 "시스템 메모리 부족" 이라는 경고가 나왔다.

728x90

'프로그래밍 언어 > 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