[Basic C++] #57_동적 메모리
C++의 "동적 메모리"에 대해 알아보겠습니다.
"전문가를 위한 C"의 22 항목, "효과적인 메모리 관리"에 해당하는 내용입니다.
동적 메모리
1. 메모리 구조
1. 코드 영역 : 컴파일된 프로그램이 저장되는 영역, ready-only!
2. 데이터 영역 : 전역 변수 및 정적 변수가 저장되는 영역
3. 힙 영역 : 동적으로 할당된 변수를 저장하는 영역
4. 스택 영역 : 함수 매개변수, 지역 변수 및 기타 함수 관련 데이터가 저장되는 영역
2. Heap
정적 메모리와 반대로 힙은 동적 메모리 할당에 사용되는 공간입니다. 동적 메모리 할당이란, 프로그램 실행 중에 메모리 공간을 할당받는 것을 의미하며, 프로그램의 종료와 함께 해제해주어 운영체제에 반납해야 합니다.
코드 예제
1. new + delete 키워드
int* ptr = new int;
"new" 키워드를 통해 동적 할당을 수행할 수 있습니다. 힙에 메모리 공간을 확보하고 "스택"에 위치한 포인터를 통해 해당 메모리를 가리키도록 하고 있습니다.
int* ptr = new int;
delete ptr;
"delete" 키워드를 통해 힙에 할당받은 메모리 공간을 해제합니다. 컴퓨터에 메모리 공간이 무한히 많아지지 않으므로, 동적 할당 받은 메모리 공간은 활용한 후에 반드시 "delete" 키워드를 통해 해제해 주어야 합니다.
2. 배열의 동적 할당, new [] + delete []
int* arrPtr = new int[5];
역시나, 배열 또한 "new" 키워드를 통해 동적 할당을 수행합니다.
delete[] arrPtr;
이때, new []를 통해 할당받은 연속되는 메모리 공간은 delete []를 통해 해제해 주어야 합니다.
3. 객체 배열의 동적 할당
// Simple 이라는 클래스가 있다고 가정...
Simple* simpleArray = new Simple[4];
객체 배열의 동적 할당 또한 배열의 동적 할당과 같습니다! 위 예제의 경우 Simple 클래스의 생성자가 총 네 번 호출됩니다!
// 1. 항목이 객체일 경우
delete[] simpleArray;
// 2. 항목이 포인터일 경우
for(int i=0; i<simpleArray.size(); i++)
delete simpleArray[i]; // 객체가 차지하는 메모리 공간 해제
// 배열 자체를 해제
delete [] simpleArray;
객체 배열 또한 delete []를 호출해주어 new []와 짝지어줍니다. 다만, 배열의 항목이 객체 그대로일 경우 delete []만 호출해주어도 무방하지만, 배열의 항목이 객체를 가리키는 포인터일 경우, "객체마다 소멸자를 호출 + 배열 자체의 해제"가 필요합니다!
'언어 > Basic C++' 카테고리의 다른 글
[Basic C++] #59_가비지 컬렉션 (1) | 2022.09.27 |
---|---|
[Basic C++] #58_포인터, 배열과 포인터, 포인터 연산, 함수 포인터, 클래스 메서드 포인터 (0) | 2022.09.22 |
[Basic C++] #56_cctype, 대문자+소문자 확인 (0) | 2022.09.15 |
[Basic C++] #55-7_템플릿 변수 (0) | 2022.08.10 |
[Basic C++] #55-6_함수 템플릿 (0) | 2022.08.04 |