동적 할당 (Dynamic Allocation)
동적 할당이란?
프로그램 실행 중에 필요한 메모리를 직접 할당하는 것을 의미한다.
동적으로 할당된 메모리는 힙(Heap) 영역에 저장되며,
개발자가 직접 생성하고 해제해야 한다.
메모리 할당
int* p = new int;
*p = 10;
동작 순서
- 힙 영역에 int 크기의 메모리 할당
- 할당된 주소를 p에 저장
- 해당 메모리에 10 저장
메모리 해제
delete p;
p = nullptr;
동작 순서
- 힙 메모리 반환
- 포인터는 더 이상 유효하지 않음
- nullptr로 초기화하는 것이 안전함
배열 동적 할당
int* arr = new int[5];
위 코드는 int 5개를 저장할 수 있는 배열을 힙에 생성한다.
배열 메모리 해제
delete[] arr;
arr = nullptr;
배열은 반드시 delete[]를 사용해야 한다.
delete arr; // 잘못된 사용
C 방식 동적 할당
메모리 할당
int* p = (int*)malloc(sizeof(int));
*p = 10;
메모리 해제
free(p);
new 와 malloc 차이
new
int* p = new int;
특징
- 메모리 할당
- 생성자 호출
- 타입 캐스팅 불필요
malloc
int* p = (int*)malloc(sizeof(int));
특징
- 단순 메모리만 할당
- 생성자 호출 안 함
- 형변환 필요
delete 와 free 차이
delete
delete p;
특징
- 소멸자 호출
- 메모리 해제
free
free(p);
특징
- 메모리만 해제
- 소멸자 호출 안 함
절대 혼용하면 안 됨
올바른 사용
int* p = new int;
delete p;
int* p = (int*)malloc(sizeof(int));
free(p);
잘못된 사용
int* p = new int;
free(p); // 위험
int* p = (int*)malloc(sizeof(int));
delete p; // 위험
동적 할당의 특징
장점
- 실행 중 크기 결정 가능
- 큰 메모리 사용 가능
- 프로그램 유연성 증가
int size;
cin >> size;
int* arr = new int[size];
단점
- 직접 해제해야 함
- 메모리 누수 발생 가능
- 관리가 어려움
메모리 누수 (Memory Leak)
동적으로 할당한 메모리를 해제하지 않으면 발생한다.
void Func()
{
int* p = new int;
} // delete 없음
위 코드는 함수가 끝나도 힙 메모리가 반환되지 않는다.
이를 메모리 누수라고 한다.
Dangling Pointer (댕글링 포인터)
해제된 메모리를 계속 가리키는 포인터
int* p = new int;
delete p;
*p = 10; // 위험
해결 방법
delete p;
p = nullptr;
객체 동적 생성
class Player
{
public:
Player()
{
cout << "생성자 호출\n";
}
~Player()
{
cout << "소멸자 호출\n";
}
};
Player* p = new Player();
delete p;
실행 결과
생성자 호출
소멸자 호출
스마트 포인터 등장 이유
기존 방식
Player* p = new Player();
// delete를 깜빡할 수 있음
현대 C++
std::shared_ptr<Player> p = std::make_shared<Player>();
std::unique_ptr<Player> p = std::make_unique<Player>();
메모리를 자동으로 관리해준다.
메모리 영역과의 관계
메모리 구조
┌─────────────┐
│ 코드 영역 │
├─────────────┤
│ 데이터 영역 │
├─────────────┤
│ 스택 영역 │ ← 지역 변수
├─────────────┤
│ 힙 영역 │ ← 동적 할당
└─────────────┘
예시
int a = 10; // 스택
int* p = new int(20); // 힙
핵심 정리
메모리 할당
int* p = new int;
메모리 해제
delete p;
배열 할당
int* arr = new int[5];
배열 해제
delete[] arr;
C 방식
malloc()
free()
C++ 방식
new
delete
한 줄 요약
동적 할당은 프로그램 실행 중 힙(Heap) 메모리를 직접 생성하고 관리하는 방식이며, 생성한 메모리는 반드시 직접 해제해야 한다.
'c++ > 기초' 카테고리의 다른 글
| const (0) | 2026.06.08 |
|---|---|
| 값 타입과 참조타입 (0) | 2026.06.08 |
| extern (외부 변수) (0) | 2026.06.05 |
| 분할 구조 (Header / Source File) (0) | 2026.06.05 |
| nullptr (0) | 2026.06.05 |