C++에서는 new와 delete 연산자를 사용해 힙(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++ 프로그램을 작성할 수 있습니다.