C와 C++에서 동적으로 메모리를 할당하고 해제하는 대표적인 방법으로 new/delete와 malloc/free가 있습니다. 두 방식 모두 힙(heap) 영역의 메모리를 관리하지만, 동작 방식과 특성에서 중요한 차이가 있습니다. 각각의 개념과 예제 코드를 살펴보겠습니다.
new / delete 연산자
new 연산자는 힙 영역에 메모리 할당을 요청합니다. 요청한 크기의 메모리를 확보할 수 있으면 해당 메모리를 초기화한 뒤 포인터 변수에 그 주소를 반환하고, 메모리가 부족하면 예외(std::bad_alloc)를 발생시킵니다.
delete 연산자는 new로 할당한 메모리를 해제하는 역할을 합니다. 프로그래머가 직접 할당한 포인터 변수를 delete로 해제할 수 있으며, 배열로 할당한 경우에는 delete[]를 사용해야 합니다.
다음은 C++에서 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
malloc / free 함수
malloc() 함수는 요청한 크기(바이트 단위)만큼의 메모리를 할당하고, 할당된 메모리의 첫 번째 바이트를 가리키는 포인터를 반환합니다. 할당에 실패하면 널 포인터(NULL)를 반환하므로, 반드시 반환값을 확인해야 합니다.
free() 함수는 malloc()으로 할당한 메모리를 해제하는 역할을 합니다. 이때 포인터 변수 자체의 값은 변경되지 않으므로, 해제 후에도 포인터는 여전히 같은 메모리 위치를 가리키게 됩니다(이른바 댕글링 포인터 상태).
다음은 C 언어에서 malloc/free를 사용하는 예제입니다.
예제 코드
#include <stdio.h>
#include <stdlib.h>
int main() {
int n = 4, i, *p, s = 0;
p = (int*) malloc(n * sizeof(int));
if(p == NULL) {
printf("\nError! memory not allocated.");
exit(0);
}
printf("\nEnter elements of array : ");
for(i = 0; i < n; ++i) {
scanf("%d", p + i);
s += *(p + i);
}
printf("\nSum : %d", s);
free(p);
return 0;
}실행 결과
Enter elements of array : 32 23 21 8 Sum : 84
new/delete와 malloc/free의 핵심 차이점
- 연산자 vs 함수:
new/delete는 C++의 연산자이고,malloc/free는 C 표준 라이브러리의 함수입니다. - 타입 안전성:
new는 할당할 타입을 명시하므로 타입에 안전하지만,malloc은void*를 반환하기 때문에 명시적인 형 변환이 필요합니다. - 초기화 지원:
new는 객체 생성 시 생성자를 자동으로 호출하고,delete는 소멸자를 호출합니다. 반면malloc/free는 생성자·소멸자를 전혀 호출하지 않습니다. - 실패 시 동작:
new는 메모리 할당 실패 시 예외(std::bad_alloc)를 던지고,malloc은 NULL을 반환합니다. - 크기 계산:
new는 컴파일러가 타입 크기를 자동으로 계산하지만,malloc은sizeof를 이용해 직접 바이트 수를 계산해야 합니다.
결론적으로 C++에서는 객체 지향 특성(생성자·소멸자 호출 등)을 활용할 수 있는 new/delete 사용이 권장되며, C 언어 환경이나 C 스타일의 저수준 메모리 관리가 필요한 경우에 malloc/free를 사용하는 것이 적절합니다.