c++/기초

동적할당

코드망령 2026. 6. 8. 09:50

동적 할당 (Dynamic Allocation)

동적 할당이란?

프로그램 실행 중에 필요한 메모리를 직접 할당하는 것을 의미한다.

동적으로 할당된 메모리는 힙(Heap) 영역에 저장되며,
개발자가 직접 생성하고 해제해야 한다.


메모리 할당

int* p = new int;
*p = 10;

동작 순서

  1. 힙 영역에 int 크기의 메모리 할당
  2. 할당된 주소를 p에 저장
  3. 해당 메모리에 10 저장

메모리 해제

delete p;
p = nullptr;

동작 순서

  1. 힙 메모리 반환
  2. 포인터는 더 이상 유효하지 않음
  3. 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