C++에서 `new` 표현식은 동적으로 메모리를 할당하여 객체 또는 배열을 생성하는 데 사용됩니다. `new`를 통해 할당된 메모리는 수동으로 해제되어야 합니다(`delete` 키워드를 사용하여).
기본적인 형태는 다음과 같습니다:
포인터_타입* 변수_이름 = new 생성자;
여기서:
- `포인터_타입`은 동적으로 할당된 메모리를 가리키기 위한 포인터의 타입입니다.
- `변수_이름`은 할당된 메모리를 가리키는 포인터 변수의 이름입니다.
- `생성자`는 동적으로 생성될 객체나 배열을 초기화하는 데 사용되는 생성자입니다.
아래는 몇 가지 예시입니다:
1. 객체 생성:
int* intValue = new int; // int 타입의 객체 동적 생성
double* doubleValue = new double(3.14); // double 타입의 객체를 초기값과 함께 동적 생성
2. 배열 생성:
int* intArray = new int[5]; // int 배열 동적 생성 (크기 5)
3. 사용자 정의 타입 객체 생성:
class MyClass {
// 클래스 멤버 정의
};
MyClass* myObj = new MyClass; // 사용자 정의 타입 객체 동적 생성
`new`로 할당된 메모리는 `delete`를 사용하여 수동으로 해제해주어야 합니다. 그렇지 않으면 메모리 누수가 발생할 수 있습니다.
delete intValue; // 객체 동적 할당 메모리 해제
delete[] intArray; // 배열 동적 할당 메모리 해제
delete myObj; // 사용자 정의 타입 객체 동적 할당 메모리 해제
C++11부터는 스마트 포인터(`std::shared_ptr`, `std::unique_ptr` 등)를 사용하여 메모리 관리를 자동화하는 것이 권장됩니다. 이는 메모리 누수의 가능성을 줄이고 코드의 안정성을 향상시킬 수 있습니다.
스마트 포인터
스마트 포인터(Smart Pointer)는 C++에서 메모리 관리를 자동화하기 위한 객체입니다. 스마트 포인터는 동적으로 할당된 메모리를 관리하고, 해당 메모리의 소유권을 추적하여 자동으로 메모리를 해제합니다. 이를 통해 메모리 누수를 방지하고, 코드의 안전성을 향상시킬 수 있습니다.
C++에서 가장 일반적으로 사용되는 스마트 포인터에는 다음과 같은 종류가 있습니다:
1. std::unique_ptr:
- `std::unique_ptr`은 단일 소유권을 가지는 스마트 포인터입니다. 특정 객체 또는 배열에 대해 단일 소유권을 가질 수 있습니다.
- 소유권은 해당 `std::unique_ptr`가 가리키는 객체 또는 배열에 대한 유일한 소유자를 의미하며, 다른 `std::unique_ptr`나 포인터에 소유권을 이전할 수 있습니다.
- 사용 예시:
std::unique_ptr<int> uniquePtr = std::make_unique<int>(42);
2. std::shared_ptr:
- `std::shared_ptr`은 여러 스마트 포인터 간에 소유권을 공유할 수 있는 스마트 포인터입니다. 동적으로 할당된 메모리에 대한 공유 소유권을 가집니다.
- 객체를 여러 `std::shared_ptr`가 공유하고 있을 때, 해당 객체는 모든 `std::shared_ptr`가 소멸될 때까지 유지됩니다.
- 사용 예시:
std::shared_ptr<int> sharedPtr = std::make_shared<int>(42);
3. std::weak_ptr:
- `std::weak_ptr`은 `std::shared_ptr`와 함께 사용되며, 서로 간에 순환 참조를 방지하는 데 사용됩니다.
- `std::weak_ptr`는 `std::shared_ptr`의 소유권을 가지지 않고, `std::shared_ptr`로부터 만들어집니다.
- 사용 예시:
std::weak_ptr<int> weakPtr = sharedPtr;
스마트 포인터를 사용하면 명시적으로 `delete`를 호출하지 않아도 되며, 자동으로 메모리 관리가 이루어집니다. 또한, 스마트 포인터를 사용하면 소유자의 수명이 끝날 때 자동으로 메모리가 해제되므로 메모리 누수의 위험이 크게 감소합니다.