make_unique<T[]>(n)
에 대해서 배열 초기화를 하지 않는다고 잘못 알고 있었던 사실이 있어서 정리해 본다. make_unique<T[]>(n)
은 내부적으로 new T[n]()
을 호출하기 때문에 기본 타입에 대해서도 초기화 동작이 발생한다. 그런 이유로 초기화 없는 배열 할당을 위해서 C++ 20에서는 make_unique_for_overwrite
가 추가되었다고 한다.
make_unique<T[]>(n)
- invokesnew T[n]()
, requesting value-initialization.
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3588.htm
C++ 20 에서는 이런 경우 사용하는 함수가 추가되었다
std::unique_ptr<char[]> arr = std::make_unique_for_overwrite<char[]>(size);
https://blog.lunapiece.net/posts/C++-Dyanamic-Size-Buffer-Without-Initialization-And-Memoryleak/
이하 deepseek v3 복음
make_unique<T[]>
C++14 표준에서는 std::make_unique
를 사용하여 동적 배열을 생성할 수 있도록 std::make_unique<T[]>
를 지원합니다. 이는 std::unique_ptr
을 사용하여 배열을 관리할 때 매우 유용합니다.
std::make_unique<T[]>
의 특징
-
배열 생성:
std::make_unique<T[]>
는T
타입의 동적 배열을 생성하고, 이를 관리하는std::unique_ptr<T[]>
를 반환합니다. -
자동 메모리 관리:
std::unique_ptr
은 소멸 시 자동으로 메모리를 해제하므로, 메모리 누수를 방지할 수 있습니다. -
초기화:
std::make_unique<T[]>
는 배열의 각 요소를 기본값으로 초기화합니다. 예를 들어,int
배열의 경우 모든 요소가0
으로 초기화됩니다.
사용 예제
#include <iostream>
#include <memory> // std::make_unique를 사용하기 위해 필요
int main() {
// int 타입의 배열 10개를 동적 할당
auto arr = std::make_unique<int[]>(10);
// 배열 초기화 및 출력
for (int i = 0; i < 10; ++i) {
arr[i] = i * 2;
std::cout << arr[i] << " ";
}
// std::unique_ptr가 소멸되면 자동으로 메모리가 해제됨
return 0;
}
주의사항
std::make_unique<T[]>
는 배열을 생성할 때만 사용할 수 있습니다. 단일 객체를 생성할 때는std::make_unique<T>
를 사용해야 합니다.std::unique_ptr<T[]>
는 배열을 관리하기 위해 특수화된 형태이므로,operator[]
를 사용하여 배열 요소에 접근할 수 있습니다. 단일 객체를 관리하는std::unique_ptr<T>
에서는operator[]
를 사용할 수 없습니다.
요약
std::make_unique<T[]>
는 C++14에서 도입된 기능으로, 동적 배열을 생성하고std::unique_ptr
로 관리할 수 있게 해줍니다.- 이 기능은 메모리 관리와 안전성을 높이는 데 도움이 되며, 배열의 각 요소를 기본값으로 초기화합니다.
이를 통해 C++에서 더 안전하고 간결하게 동적 배열을 관리할 수 있습니다.