Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ new와 delete 연산자 완벽 정리: 동적 메모리 할당과 해제 방법

C++에서는 newdelete 연산자를 사용해 힙(heap) 영역의 메모리를 동적으로 할당하고 해제할 수 있습니다. 이 두 연산자를 제대로 이해하면 프로그램 실행 중에 필요한 만큼 메모리를 유연하게 관리할 수 있습니다.

new 연산자란?

new 연산자는 힙 영역에 메모리 할당을 요청하는 연산자입니다. 요청한 크기의 메모리가 충분히 남아 있다면, 해당 메모리를 포인터 변수에 초기화하고 그 주소를 반환합니다.

C++에서 new 연산자의 기본 문법은 다음과 같습니다.

pointer_variable = new datatype;

메모리를 할당하면서 동시에 값을 초기화하려면 아래와 같이 작성합니다.

pointer_variable = new datatype(value);

배열처럼 연속된 메모리 블록을 한 번에 할당하려면 대괄호와 크기를 지정합니다.

pointer_variable = new datatype[size];

new 연산자 예제 코드

다음은 C++에서 new 연산자를 다양하게 활용하는 예제입니다.

#include <iostream>
using namespace std;
int main () {
    int *ptr1 = NULL;
    ptr1 = new int;              // int 크기의 메모리 할당
    float *ptr2 = new float(223.324);  // 할당과 동시에 초기화
    int *ptr3 = new int[28];     // 28개 크기의 메모리 블록 할당
    *ptr1 = 28;
    cout << "Value of pointer variable 1 : " << *ptr1 << endl;
    cout << "Value of pointer variable 2 : " << *ptr2 << endl;
    if (!ptr3)
        cout << "Allocation of memory failed\n";
    else {
        for (int i = 10; i < 15; i++)
            ptr3[i] = i+1;
        cout << "Value of store in block of memory: ";
        for (int i = 10; i < 15; i++)
            cout << ptr3[i] << " ";
    }
    return 0;
}

실행 결과

Value of pointer variable 1 : 28
Value of pointer variable 2 : 223.324
Value of store in block of memory: 11 12 13 14 15

위 예제에서 볼 수 있듯이, new 연산자는 단일 변수용 메모리뿐 아니라 초기값을 지정한 메모리, 배열 형태의 메모리 블록까지 모두 할당할 수 있습니다.

delete 연산자란?

delete 연산자는 new로 할당한 메모리를 해제(deallocate)하는 역할을 합니다. 개발자가 직접 생성한 포인터 변수가 가리키는 메모리를 delete 연산자로 반납할 수 있으며, 이를 통해 메모리 누수(memory leak)를 방지할 수 있습니다.

C++에서 delete 연산자의 기본 문법은 다음과 같습니다.

delete pointer_variable;

배열 형태로 할당된 메모리 블록을 해제할 때는 대괄호를 함께 사용해야 합니다.

delete[] pointer_variable;

delete 연산자 예제 코드

다음은 new로 할당한 메모리를 delete로 해제하는 전체 예제입니다.

#include <iostream>
using namespace std;
int main () {
    int *ptr1 = NULL;
    ptr1 = new int;
    float *ptr2 = new float(299.121);
    int *ptr3 = new int[28];
    *ptr1 = 28;
    cout << "Value of pointer variable 1 : " << *ptr1 << endl;
    cout << "Value of pointer variable 2 : " << *ptr2 << endl;
    if (!ptr3)
        cout << "Allocation of memory failed\n";
    else {
        for (int i = 10; i < 15; i++)
            ptr3[i] = i+1;
        cout << "Value of store in block of memory: ";
        for (int i = 10; i < 15; i++)
            cout << ptr3[i] << " ";
    }
    delete ptr1;      // 단일 변수 메모리 해제
    delete ptr2;      // 단일 변수 메모리 해제
    delete[] ptr3;    // 배열 메모리 블록 해제
    return 0;
}

실행 결과

Value of pointer variable 1 : 28
Value of pointer variable 2 : 299.121
Value of store in block of memory: 11 12 13 14 15

정리: new와 delete 사용 시 주의사항

  • new로 할당한 메모리는 반드시 delete로 해제해야 메모리 누수를 막을 수 있습니다.
  • 배열로 할당한 메모리는 반드시 delete[]로 해제해야 하며, 일반 delete를 사용하면 미정의 동작(undefined behavior)이 발생할 수 있습니다.
  • 이미 해제된 포인터를 다시 delete하는 이중 해제(double free)는 피해야 합니다.
  • 해제 후에는 포인터를 nullptr로 설정해 두는 것이 안전한 습관입니다.

new와 delete 연산자를 올바르게 활용하면 실행 시점에 필요한 만큼 메모리를 동적으로 관리할 수 있어, 보다 효율적이고 안정적인 C++ 프로그램을 작성할 수 있습니다.