본문으로 건너뛰기
모던 C++ 심화LESSON 07

std::unique_ptr: 단일 소유권과 안전한 객체 이동

난이도중급 → 심화
예상 시간70분
선수지식이전 강의

7강. std::unique_ptr: 단일 소유권과 안전한 객체 이동

이번 강의에서 해결할 문제​

동적 객체를 정확히 한 곳이 소유한다면 복사 가능한 포인터는 위험합니다. std::unique_ptr는 단일 소유권을 타입으로 강제하며, 소유권을 넘길 때만 명시적으로 이동합니다.

학습 목표​

먼저 알아야 할 핵심 개념​

unique_ptr<T> 하나가 동적 T 객체를 소유합니다. 소유 포인터가 파괴되거나 다른 포인터로 이동되면 대상 정리 책임도 함께 이동합니다. get()으로 얻은 raw pointer는 소유권이 없는 관찰자이며 unique_ptr보다 오래 저장하면 안 됩니다.

왜 이 문제가 위험한가​

이동 후 원본 unique_ptr는 보통 null이 되지만, 이동된 대상의 새 소유자를 추적하지 않으면 잘못 접근할 수 있습니다. release()는 소유권을 raw pointer로 풀어 자동 정리를 중단하므로 C API 경계 같은 명확한 이유 없이 사용하면 누수를 만들기 쉽습니다.

가장 작은 예제로 시작하기​

unique_task.cpp
#include <iostream>
#include <memory>
#include <string>
#include <utility>
#include <vector>

struct Task {
std::string name;
explicit Task(std::string value) : name{std::move(value)} {}
};

std::unique_ptr<Task> makeTask(std::string name) {
return std::make_unique<Task>(std::move(name));
}

int main() {
auto task = makeTask("build");
std::vector<std::unique_ptr<Task>> queue;
queue.push_back(std::move(task));

std::cout << std::boolalpha << (task == nullptr) << '\n';
std::cout << queue.front()->name << '\n';
}

코드 한 줄씩 이해하기​

  1. 팩토리는 unique_ptr 값을 반환해 호출자에게 소유권을 전달합니다.
  2. queue는 각 Task를 단일 소유하는 포인터를 값으로 보관합니다.
  3. std::move(task)는 task를 이동 가능한 값 범주로 바꿔 push_back이 소유권을 가져가게 합니다.
  4. 이동 뒤 원본 task는 접근하지 않고 null 여부만 확인합니다.
  5. queue가 파괴되면 안의 모든 작업도 정확히 한 번 정리됩니다.

실행 결과와 메모리·동작 흐름​

첫 줄은 true, 둘째 줄은 build입니다. 동적 Task의 주소가 반드시 바뀌는 것은 아니지만 소유자는 지역 변수 task에서 queue 원소로 바뀝니다. 이동은 소유권 계약의 변화이며 메모리 복사 여부를 단정하지 않습니다.

단계별 실습​

흔한 실수와 해결 방법​

언제 사용하고 언제 피할까​

단일 소유 동적 객체, 런타임 다형성, 큰 구현 은닉에 적합합니다. 공유 수명이 실제 도메인 요구가 아니면 shared_ptr로 바꾸지 않습니다. 동적 수명이 불필요한 값에는 사용하지 않습니다.

게임 개발 연결​

표준 C++의 unique_ptr와 Unreal의 TUniquePtr는 단일 소유권이라는 생각은 비슷합니다. 그러나 UObject는 엔진 GC와 Reflection 수명 규칙을 따르므로 std::unique_ptr<UObject>로 소유하거나 직접 delete하지 않습니다. 일반 비-UObject 헬퍼 객체에만 해당 소유권 모델을 적용합니다.

이해 점검 질문 3개​

  1. unique_ptr가 복사되지 않는 것이 이중 해제를 어떻게 막나요?
  2. std::move 호출 뒤 실제 소유자는 어디에서 확인해야 하나요?
  3. get()이 반환한 raw pointer를 장기 보관하면 어떤 문제가 생기나요?

핵심 요약​

다음 강의 연결​

8강. shared_ptr와 weak_ptr에서 실제 공동 소유가 필요한 경우와 순환 참조를 다룹니다.

MINI QUIZ

std::unique_ptr: 단일 소유권과 안전한 객체 이동 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“std::unique_ptr: 단일 소유권과 안전한 객체 이동” 작업 전 검토에서 채택해야 할 안전 기준은 무엇인가요?
  2. 문제 2“std::unique_ptr: 단일 소유권과 안전한 객체 이동”의 작업 기준으로 ‘std::move 뒤 원본 사용’을 진단하거나 바로잡은 선택은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

7강. std::unique_ptr: 단일 소유권과 안전한 객체 이동 미완료 상태