본문 바로가기
프로그래밍/C

[C언어/C++] 메모리 동적 할당 malloc/free vs new/delete 차이점 완전 정리 (시험 단골 주제)

by 아임코딩 2026. 8. 13.
반응형

C언어 프로그래밍을 배운 뒤 C++로 확장하거나, 대학 컴퓨터공학과 기말고사, 정처기(정보처리기사) 시험을 준비할 때 반드시 정리해야 하는 핵심 개념이 있습니다. 바로 동적 메모리 할당(Dynamic Memory Allocation) 방식의 차이입니다.

C언어의 malloc / free 함수와 C++의 new / delete 연산자는 모두 힙(Heap) 영역에 메모리를 할당하고 해제하는 역할을 하지만, 내부 동작과 기능에는 엄청난 차이가 있습니다. 핵심 개념부터 한눈에 보는 비교표, 시험 단골 포인트까지 깔끔하게 정리해 드립니다!

1. C언어의 메모리 동적 할당: malloc() 과 free()

C언어에서는 <stdlib.h> 헤더 파일에 정의된 함수(Function)인 malloc()과 free()를 사용하여 메모리를 동적으로 할당하고 해제합니다.

  • malloc(size_t size): 지정한 바이트(Byte) 크기만큼 힙 영역에 메모리를 할당하고, 그 메모리의 시작 주소를 void* 형으로 반환합니다.
  • free(void* ptr): malloc()으로 할당받은 메모리를 시스템에 반환(해제)합니다.

💻 malloc / free 예제 코드

C
 
#include <stdio.h>
#include <stdlib.h> // malloc, free 사용을 위해 필수!

int main() {
    // int 타입 5개 크기(4byte * 5 = 20byte) 만큼 동적 할당
    int *arr = (int*)malloc(sizeof(int) * 5); 

    if (arr == NULL) { // 메모리 할당 실패 예외 처리
        printf("메모리 할당 실패!\n");
        return 1;
    }

    // 메모리 사용
    for (int i = 0; i < 5; i++) {
        arr[i] = (i + 1) * 10;
    }

    // 할당받은 메모리 해제 (필수)
    free(arr);
    return 0;
}

💡 malloc의 특징

  1. 바이트 단위 직접 계산: sizeof() 연산자를 사용해 필요한 메모리 크기를 바이트 단위로 직접 계산해서 넘겨줘야 합니다.
  2. 형변환(Casting) 필요: 반환 타입이 void*이므로, 사용하는 변수의 포인터 타입에 맞게 명시적 형변환 (int*)을 해주어야 합니다.
  3. 초기화 불가: 메모리 공간만 잡을 뿐 내부 값을 초기화해주지 않으므로 쓰레기 값이 들어있습니다.

2. C++의 메모리 동적 할당: new 와 delete

C++에서는 함수가 아닌 키워드(연산자, Operator) 형태의 new와 delete를 도입했습니다.

  • new 타입: 지정한 타입의 크기만큼 메모리를 자동으로 계산하여 할당하고, 해당 타입의 포인터를 바로 반환합니다.
  • delete 포인터: new로 할당된 메모리를 해제합니다. (배열 할당 시 delete[] 사용)

💻 new / delete 예제 코드

C++
 
#include <iostream>
using namespace std;

int main() {
    // int 타입 5개 크기 동적 할당 (크기 자동 계산, 형변환 불필요)
    int *arr = new int[5]; 

    // 메모리 사용
    for (int i = 0; i < 5; i++) {
        arr[i] = (i + 1) * 10;
    }

    // 배열 메모리 해제 시 delete[] 사용!
    delete[] arr; 
    return 0;
}

💡 new의 특징

  1. 타입 기반 자동으로 크기 계산: sizeof를 쓸 필요 없이 타입 이름만 적어주면 컴파일러가 알아서 메모리 크기를 계산합니다.
  2. 형변환 불필요: 해당 타입의 포인터가 바로 반환되므로 (int*)와 같은 명시적 형변환이 필요 없습니다.
  3. ⭐ 생성자(Constructor) 자동 호출: 클래스/객체를 할당할 때 생성자가 자동으로 호출되어 객체를 초기화합니다. (가장 결정적인 차이!)

3. 가장 결정적인 차이: 객체 생성자 / 소멸자 호출 여부

시험에서 서술형 고득점을 판가름하는 가장 핵심적인 차이점입니다!

  • malloc / free: 단순히 메모리 공간(바이트)만 잡고 풀 뿐, 클래스의 생성자(Constructor)와 소멸자(Destructor)를 전혀 호출하지 않습니다. C++ 객체지향 프로그래밍에서는 사용할 수 없습니다.
  • new / delete: 메모리를 할당함과 동시에 생성자를 자동으로 호출하여 객체를 초기화하고, delete 실행 시 소멸자를 자동으로 호출하여 안전하게 객체를 정돈합니다.
C++
 
class Test {
public:
    Test() { cout << "생성자 호출!\n"; }
    ~Test() { cout << "소멸자 호출!\n"; }
};

int main() {
    Test *t1 = (Test*)malloc(sizeof(Test)); // 생성자 호출 안 됨!
    free(t1);                                // 소멸자 호출 안 됨!

    Test *t2 = new Test(); // "생성자 호출!" 출력됨
    delete t2;             // "소멸자 호출!" 출력됨
    return 0;
}

4. 한눈에 비교하는 차이점 (시험 핵심 요약)

시험 직전에 이것만 암기하면 끝나는 필수 요약표입니다!

구분 malloc() / free() new / delete
정의/정체 함수 (Function) 연산자 / 키워드 (Operator)
헤더 파일 <stdlib.h> 필요 별도 헤더 필요 없음 (C++ 기본 제공)
할당 단위 바이트(Byte) 크기 직접 지정 타입(Type) 지정 (크기 자동 계산)
반환 타입 void* (명시적 형변환 필요) 해당 타입 포인터 (형변환 불필요)
생성자/소멸자 호출 불가능 자동 호출됨
재할당 지원 realloc()으로 크기 변경 가능 재할당 연산자 없음 (신규 할당 후 복사)
배열 해제 free(ptr) delete[] ptr (배열 전용 해제 키워드)

5. 시험 단골 출제 유형 체크

  1. Q. C++에서 객체를 동적 할당할 때 malloc 대신 new를 사용해야 하는 가장 핵심적인 이유는?
  2. 👉 new 연산자는 메모리 할당과 동시에 객체의 생성자(Constructor)를 자동으로 호출하여 객체를 초기화해 주기 때문입니다. (malloc은 생성자를 호출하지 않음)
  3. Q. new[] 연산자로 동적 할당한 배열을 해제할 때 올바른 표현식은?
  4. 👉 단순히 delete ptr;가 아니라 delete[] ptr; 형태로 대괄호를 붙여서 해제해야 모든 배열 요소의 소멸자가 올바르게 호출됩니다.
반응형