C++ 메모리 관리 마스터: new와 delete 전문가 활용법
C++ 메모리 관리 마스터: new와 delete 전문가 활용법
이 가이드에서는 명확한 실전 예제를 통해 C++에서 new와 delete로 힙 메모리를 할당하고 해제하는 방법을 설명합니다.
소개
C++은 런타임에 메모리를 할당하는 동적 메모리 할당 기능을 개발자에게 제공합니다. Java나 Python 같은 관리형 언어와 달리 C++은 힙 메모리를 자동으로 회수하지 않으며, 프로그래머가 명시적으로 해제해야 합니다.
new와 delete 연산자는 이 작업의 기본 메커니즘을 제공합니다. 이 연산자들은 C++에서 수동 메모리 관리의 초석이며 C++ 표준 라이브러리에 정의되어 있습니다.
new 연산자
new 연산자는 힙에 메모리 블록을 할당하고 첫 번째 바이트에 대한 포인터를 반환합니다. 예를 들어:
// int 포인터 선언
int* pointVar;
// new로 동적 메모리 할당
pointVar = new int;
// 할당된 메모리에 값 할당
*pointVar = 45;
이 코드에서 pointVar는 새로 할당된 int의 주소를 받습니다. new가 포인터를 반환하므로 변수는 포인터 타입이어야 합니다. 배열의 경우 new는 첫 번째 요소에 대한 포인터를 반환합니다:
int* arr = new int[10]; // arr은 10개 int 배열의 첫 번째 요소를 가리킴
일반적인 문법은 다음과 같습니다:
pointerVariable = new dataType; // 단일 객체
pointerVariable = new dataType[size]; // 배열
delete 연산자
new로 할당된 객체나 배열이 더 이상 필요하지 않으면 delete를 호출해 메모리를 운영체제에 반환해야 합니다. 이를 하지 않으면 메모리 누수가 발생해 성능 저하나 애플리케이션 충돌을 초래할 수 있습니다.
단일 객체의 경우:
delete pointerVariable;
new[]로 할당된 배열의 경우 배열 형태를 사용합니다:
delete[] pointerVariable;
완전한 생명주기 예제:
// int 할당
int* pointVar = new int;
*pointVar = 45;
cout << *pointVar; // 출력: 45
// 해제
delete pointVar;
팁: 모든 new에는 대응하는 delete(배열의 경우 delete[])를 짝지어 주세요. 실무 코드에서는 RAII나 스마트 포인터(std::unique_ptr 등)를 사용해 이 과정을 자동화하세요.
예제 1: 기본 동적 할당
#include <iostream>
using namespace std;
int main() {
int* pointInt;
float* pointFloat;
pointInt = new int;
pointFloat = new float;
*pointInt = 45;
*pointFloat = 45.45f;
cout << *pointInt << endl;
cout << *pointFloat << endl;
delete pointInt;
delete pointFloat;
return 0;
}
출력
45
45.45
이 프로그램은 두 기본 타입의 할당, 대입, 출력, 깔끔한 해제를 보여줍니다.
참고: 크기가 런타임에 결정될 때 동적 할당은 유연성을 높여줍니다.
예제 2: float 배열 할당
#include <iostream>
using namespace std;
int main() {
int num;
cout << "학생 수 입력: ";
cin >> num;
float* ptr = new float[num];
cout << "학생들의 GPA 입력." << endl;
for (int i = 0; i < num; ++i) {
cout << "학생" << i + 1 << ": ";
cin >> *(ptr + i);
}
cout << "\n학생들의 GPA 출력." << endl;
for (int i = 0; i < num; ++i) {
cout << "학생" << i + 1 << " :" << *(ptr + i) << endl;
}
delete[] ptr;
return 0;
}
출력
학생 수 입력: 4
학생들의 GPA 입력.
학생1: 3.6
학생2: 3.1
학생3: 3.9
학생4: 2.9
학생들의 GPA 출력.
학생1 :3.6
학생2 :3.1
학생3 :3.9
학생4 :2.9
프로그램은 사용자로부터 학생 수를 입력받아 해당 크기의 float 배열을 할당하고, 입력을 받아 출력한 뒤 delete[]로 메모리를 해제합니다.
예제 3: 객체 동적 할당
#include <iostream>
using namespace std;
class Student {
int age;
public:
Student() : age(12) {}
void getAge() {
cout << "Age = " << age << endl;
}
};
int main() {
Student* ptr = new Student();
ptr->getAge();
delete ptr;
return 0;
}
출력
Age = 12
이 예제는 힙에 Student 객체를 생성합니다. 생성자가 age를 12로 초기화하고 getAge 메서드가 이를 출력합니다. 사용 후 delete로 객체 메모리를 해제합니다.