std::unique_ptr: 단일 소유권과 안전한 객체 이동
7강. std::unique_ptr: 단일 소유권과 안전한 객체 이동
이번 강의에서 해결할 문제
동적 객체를 정확히 한 곳이 소유한다면 복사 가능한 포인터는 위험합니다. std::unique_ptr는 단일 소유권을 타입으로 강제하며, 소유권을 넘길 때만 명시적으로 이동합니다.
학습 목표
먼저 알아야 할 핵심 개념
unique_ptr<T> 하나가 동적 T 객체를 소유합니다. 소유 포인터가 파괴되거나 다른 포인터로 이동되면 대상 정리 책임도 함께 이동합니다. get()으로 얻은 raw pointer는 소유권이 없는 관찰자이며 unique_ptr보다 오래 저장하면 안 됩니다.
왜 이 문제가 위험한가
이동 후 원본 unique_ptr는 보통 null이 되지만, 이동된 대상의 새 소유자를 추적하지 않으면 잘못 접근할 수 있습니다. release()는 소유권을 raw pointer로 풀어 자동 정리를 중단하므로 C API 경계 같은 명확한 이유 없이 사용하면 누수를 만들기 쉽습니다.
가장 작은 예제로 시작하기
#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';
}
코드 한 줄씩 이해하기
- 팩토리는
unique_ptr값을 반환해 호출자에게 소유권을 전달합니다. queue는 각Task를 단일 소유하는 포인터를 값으로 보관합니다.std::move(task)는task를 이동 가능한 값 범주로 바꿔push_back이 소유권을 가져가게 합니다.- 이동 뒤 원본
task는 접근하지 않고 null 여부만 확인합니다. queue가 파괴되면 안의 모든 작업도 정확히 한 번 정리됩니다.
실행 결과와 메모리·동작 흐름
첫 줄은 true, 둘째 줄은 build입니다. 동적 Task의 주소가 반드시 바뀌는 것은 아니지만 소유자는 지역 변수 task에서 queue 원소로 바뀝니다. 이동은 소유권 계약의 변화이며 메모리 복사 여부를 단정하지 않습니다.
단계별 실습
흔한 실수와 해결 방법
언제 사용하고 언제 피할까
단일 소유 동적 객체, 런타임 다형성, 큰 구현 은닉에 적합합니다. 공유 수명이 실제 도메인 요구가 아니면 shared_ptr로 바꾸지 않습니다. 동적 수명이 불필요한 값에는 사용하지 않습니다.
게임 개발 연결
표준 C++의 unique_ptr와 Unreal의 TUniquePtr는 단일 소유권이라는 생각은 비슷합니다. 그러나 UObject는 엔진 GC와 Reflection 수명 규칙을 따르므로 std::unique_ptr<UObject>로 소유하거나 직접 delete하지 않습니다. 일반 비-UObject 헬퍼 객체에만 해당 소유권 모델을 적용합니다.
이해 점검 질문 3개
unique_ptr가 복사되지 않는 것이 이중 해제를 어떻게 막나요?std::move호출 뒤 실제 소유자는 어디에서 확인해야 하나요?get()이 반환한 raw pointer를 장기 보관하면 어떤 문제가 생기나요?
핵심 요약
다음 강의 연결
8강. shared_ptr와 weak_ptr에서 실제 공동 소유가 필요한 경우와 순환 참조를 다룹니다.
std::unique_ptr: 단일 소유권과 안전한 객체 이동 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.