[기술 질문] #6_동적 할당
C++의 동적 할당에 대해 알아보겠습니다.
Overview
- 개념
- malloc, free
- new, delete
- virtualalloc, virtualfree
#1 개념
1. 동적 할당?
- 동적 메모리 할당이란 프로그램 실행 중에 메모리 공간을 할당받는 것을 의미하며, 프로그램의 종료와 함께 운영체제에 반납합니다.
- 정적 메모리 할당과 대조적으로, 메모리 구조의 "힙 영역"에 할당됩니다.
- 컴퓨터에 메모리 공간이 무한히 많아지지 않으므로, 동적 할당받은 메모리 공간은 활용 후에 반드시 명시적으로 해제해주어야 합니다.
- 동적 메모리 할당은 컴파일 시점이 아니라, 런타임 중에 그 크기가 결정되어 유연성을 제공하지만, 접근과 할당 성능이 비교적 느리고 사용자가 직접 관리해야하는 불편함이 있습니다.
#2 malloc, free
1. C의 동적 메모리 할당
#include <iostream>
using namespace std;
int main()
{
int* arr = (int*)malloc(sizeof(int) * 4);
for (size_t i = 0; i < 4; i++)
{
arr[i] = i;
}
free(arr);
}
Details
- malloc(size_t size) 함수는 인자로 받은 size 크기만큼 동적으로 메모리를 할당받습니다.
- malloc 함수는 성공 시 "void*"를 반환하여, 개발자의 입맛에 맞게 타입 캐스팅 해주면 됩니다.
- 메모리 낭비를 방지하기 위해 반드시 free() 함수를 통해 해제해 줍니다.
#3 new, delete
1. C++의 동적 메모리 할당
#include <iostream>
using namespace std;
int main()
{
int* arr = new int[4];
for (size_t i = 0; i < 4; i++)
{
arr[i] = i;
cout << arr[i] << endl;
}
delete [] arr;
}
Details
- new 키워드를 통해 동적 메모리 할당을 진행합니다.
- 동적 할당받은 메모리영역을 가리키는 포인터는 스택에 위치합니다.
- delete 키워드를 통해 힙 영역에 할당받은 메모리 영역을 명시적으로 해제해 줍니다.
- new - delete와 짝을 이루고, new [] - delete []가 짝을 이룹니다.
#4 virtualalloc, virtualfree
1. 개념
LPVOID VirtualAlloc(
[in, optional] LPVOID lpAddress,
[in] SIZE_T dwSize,
[in] DWORD flAllocationType,
[in] DWORD flProtect
);
- VirtualAlloc 함수는 호출 프로세스의 가상 주소 공간에서 페이지 영역의 상태를 예약(Reserve), 커밋(Commit), 또는 변경합니다. 할당된 메모리는 0으로 초기화됩니다.
- 가상 메모리 할당 함수들은 메모리를 Reserve(예약) 할 수 있습니다. 물리적인 메모리 공간을 소비하지 않고, 주소 공간만 미리 할당받을 수 있습니다. 더불어, 할당받은 메모리 공간에 대한 접근 권한을 지정하는 것 또한 가능하죠!
- 간단하게 Virtual Memory(가상 메모리)를 설명하자면, Win32 프로세스가 갖는 4G의 가상 메모리 공간은 "Page" 단위로 구성됩니다. 시스템마다 Page의 크기는 상이하고, Intel의 CPU는 보통 4KB 크기의 Page를 갖고 있습니다. 그리고, 각 Page는 3가지 상태(자유, 예약, 커밋)를 갖습니다.
2. 함수 설명
- 첫 번째 인자, "IpAddress"는 할당할 메모리 지역의 시작 주소입니다. 메모리가 이미 예약되어 커밋 중인 경우 주소는 다음 페이지 경계로 반올림됩니다.
- 두 번째 인자는 할당받을 크기입니다. 어떤 숫자를 넣던 4KB 단위로 끊어서 처리됩니다.
- 세 번째 인자는 할당 유형을 결정하며, MEM_COMMIT(커밋), MEM_RESERVE(예약), MEM_RESET(지정 범위 관심 없음), MEM_RESET_UNDO(Reset 효과 취소) 등이 있습니다.
- 네 번째 인자는 할당한 페이지의 접근 지정자를 설정하며, 읽기, 쓰기 등의 권한등을 설정합니다.
3. 코드
// 가상 주소 공간의 페이지 영역 할당
int* ptr = (int*)VirtualAlloc(NULL, sizeof(int)*10, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
VirtualFree(ptr,sizeof(int)*10,MEM_DECOMMIT);
VirtualFree(ptr,0,MEM_RELEASE);
'언어 > 기술 질문' 카테고리의 다른 글
[기술 질문]#9_부동 소수점, float (0) | 2023.02.18 |
---|---|
[기술 질문]#9_객체 지향 프로그래밍(OOP) (0) | 2023.02.12 |
[기술 질문]#5_struct, 구조체 (0) | 2023.01.21 |
[기술 질문]#4_#define, 매크로 (0) | 2023.01.08 |
[기술 질문]#3_const 키워드 (0) | 2023.01.07 |