[cpp] make_unique<T[]>(n)

@codemaru · February 02, 2025 · 3 min read

make_unique<T[]>(n)에 대해서 배열 초기화를 하지 않는다고 잘못 알고 있었던 사실이 있어서 정리해 본다. make_unique<T[]>(n)은 내부적으로 new T[n]()을 호출하기 때문에 기본 타입에 대해서도 초기화 동작이 발생한다. 그런 이유로 초기화 없는 배열 할당을 위해서 C++ 20에서는 make_unique_for_overwrite가 추가되었다고 한다.

make_unique<T[]>(n) - invokes new 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[]>의 특징

  1. 배열 생성: std::make_unique<T[]>T 타입의 동적 배열을 생성하고, 이를 관리하는 std::unique_ptr<T[]>를 반환합니다.

  2. 자동 메모리 관리: std::unique_ptr은 소멸 시 자동으로 메모리를 해제하므로, 메모리 누수를 방지할 수 있습니다.

  3. 초기화: 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++에서 더 안전하고 간결하게 동적 배열을 관리할 수 있습니다.

@codemaru
돌아보니 좋은 날도 있었고, 나쁜 날도 있었다. 그런 나의 모든 소소한 일상과 배움을 기록한다. 여기에 기록된 모든 내용은 한 개인의 관점이고 의견이다. 내가 속한 조직과는 1도 상관이 없다.
(C) 2001 YoungJin Shin, 0일째 운영 중