🤔 동적 메모리 할당
이번 포스팅에서는 동적 메모리 할당에 대해 알아보도록 하겠습니다.
중간고사를 대비하여 정리한 내용이기 때문에 내용이 매우 부실할 수 있습니다.
기회가 된다면 C++언어에 대해 제대로 알아보는 시간을 갖도록 하겠습니다.
해당 포스팅은 장진수 교수님의 객체지향설계 과목을 수강하며 작성한 내용임을 알립니다.
🔎 동적 메모리를 사용하는 이유
지역변수는 자신의 지역 내에서만 유효한데, 전역변수처럼 프로그램이 끝날 때까지 값을 유지하고 싶은 경우 사용합니다.
프로그램 작성시(컴파일시)는 필요한 메모리 공간의 크기를 모르겠고, 프로그램을 실행할 때(runtime) 메모리의 양을 결정해야 하는 경우 사용합니다. ( 사용자 입력에 필요한 메모리 공간을 확보하는 경우)
지금까지는 프로그램을 실행하기 전에 고정된 크기를 가지도록 변수, 배열, 객체를 선언할 때 사용합니다. ( 지역변수가 저장되는 스택은 한정되어 있어서 너무 큰 크기는 할당이 어렵습니다. )
실행 시간에 할당되어 사용되는 메모리 블록 heap을 사용한다.
동적 메모리의 단점은 스택보다 느리며 동적으로 확보된 기억공간은 기억공간에 이름이 없기 때문에 주소를 사용하므로 포인터에 대한 이해가 필요합니다.
✍️ 정적 vs 동적 메모리 할당
정적 메모리 할당
컴파일 시 필요한 메모리를 할당
사용하지 않는 메모리까지 충분히 잡아 낭비
너무 큰 메모리는 할당 불가
보통 수 kB까지는 스택 사용, 그 이상은 heap에 할당
동적 메모리 할당
실행시 필요한 메모리 할당
필요한 만큼만 잡음
메모리의 주소를 사용(포인터 이용)하여 접근
new/delete 사용( new : 메모리 할당, 할당된 메모리 시작주소 리턴됨, delete : 할당 받은 메모리 해제 )
✍️Stack
지역변수
자신의 지역 내에서만 유효하다
함수가 반환되면 지역변수는 사라진다
전역변수
프로그램이 끝날 때까지 값을 유지한다.
프로그램의 모든 부분에서 접근이 가능하다
이해하기 어렵고 유지보수 어렵다
🔎 동적 메모리의 할당과 해제(new / delete)
new 는 메모리를 동적으로 할당하고, 할당된 메모리에 대한 주소를 반환하는 연산자입니다.
요구한 만큼의 메모리가 충분하지 않으면 new는 null 포인터를 반환합니다.
delete는 더이상 필요 없는 메모리를 해제합니다.
해제하지 않으면 메모리 누수가 발생하여 다른 프로그램에서도 해당 메모리는 사용하지 못합니다.
장점
new는 지정된 형의 크기만큼 메모리를 자동적으로 할당해준다.
즉, 필요한 메모리의 크기를 계산하기 위해 sizeof()와 같은 연산자가 필요 없다.
int *pi = new int;
int *pi = (int *)malloc(sizeof(int));
new는 지정된 형의 포인터(메모리 시작주소)를 자동적으로 반환한다.
new와 delete는 중첨이 가능하다.
동적으로 할당된 객체를 초기화 할 수 있다
✍️ 기본 자료형
할당
포인터 변수 = new 자료형;
int * pi = new int; //정수형 자료를 저장하기 위한 4바이트 공간 할당.
포인터 변수 = new 자료형(초기값);
int * pi = new int(2); //초기값을 줄 경우
해제
delete 포인터변수;
delete pi;
✍️ 배열
할당
포인터변수 = new 배열;
int * pi = new int[5]; // 정수형 자료 5개를 저장하기 위한 20바이트 공간 할당.
해제
delete []포인터변수;
delete []pi; // 주의 : []을 꼭 써야 함
🔎 스택과 힙
에잇 몰라잉 다음에 할래 ㅋㅋㅋ
'언어 > C++' 카테고리의 다른 글
[C++] 레퍼런스(Reference) (0) | 2022.10.26 |
---|---|
[C++] C++언어에서 지원하는 C언어의 문법 (0) | 2022.10.26 |
[C++] Namespace (0) | 2022.10.26 |
[C++] 생성자/소멸자 (0) | 2022.10.26 |
[C++] 클래스, 함수 오버로딩 (0) | 2022.10.26 |