개발/코더 탈출
C++ 스마트 포인터 정리
-=HaeJuK=-
2025. 4. 18. 12:13
728x90
반응형
C++ 스마트 포인터 정리
1. 스마트 포인터 종류 및 예제
스마트 포인터 | 설명 | 소유권 | 예제 |
---|---|---|---|
unique_ptr |
단일 소유, 이동만 가능 | O | std::unique_ptr<int> up = std::make_unique<int>(10); |
shared_ptr |
참조 카운트 기반 공유 | O | std::shared_ptr<int> sp = std::make_shared<int>(10); |
weak_ptr |
소유권 없이 생존 확인용 | X | std::weak_ptr<int> wp = sp; if (auto locked = wp.lock()) { *locked += 1; } |
2. 포인터 복사의 위험도
포인터 | 복사 가능 여부 | 복사 위험도 | 설명 |
---|---|---|---|
unique_ptr | ❌ 복사 불가 (이동만 가능) | ❌ 방지됨 | 단일 소유를 강제함 |
shared_ptr | ✅ 복사 가능 | ⚠️ 참조 카운트 증가 | 순환 참조 주의 |
weak_ptr | ✅ 복사 가능 | ✅ 안전 | 컨트롤 블록만 공유 |
3. 포인터 간 전환 및 복사
From \\ To | unique_ptr | shared_ptr | weak_ptr |
---|---|---|---|
unique_ptr | ❌ | ✅ (std::move) | ❌ |
shared_ptr | ❌ | ✅ | ✅ |
weak_ptr | ❌ | ❌ (lock 필요) | ✅ |
4. 네트워크 세션 관리 예제
위험한 구조 (raw pointer 사용)
class SessionManager {
std::map<int, Session*> m_sessions;
};
void IOWorker(Session* pSession) {
pSession->sendPacket(); // ❌ 소멸되었을 수도 있음
}
안전한 구조 (shared_ptr + weak_ptr)
class Session : public std::enable_shared_from_this<Session> {
public:
void sendPacket();
};
class SessionManager {
std::map<int, std::shared_ptr<Session>> m_sessions;
public:
std::shared_ptr<Session> getSession(int id) {
return m_sessions[id];
}
};
void IOWorker(std::weak_ptr<Session> wpSession) {
if (auto sp = wpSession.lock()) {
sp->sendPacket();
} else {
std::cout << "Session expired\n";
}
}
사용 예
std::shared_ptr<Session> spSession = std::make_shared<Session>();
m_sessions[sessionId] = spSession;
std::weak_ptr<Session> wp = spSession;
std::thread t(IOWorker, wp).detach();
5. 스마트 포인터 선택 가이드
상황 | 선택할 포인터 |
---|---|
단일 소유, 명확한 수명 | unique_ptr |
여러 객체가 공유 | shared_ptr |
생존 여부만 확인 | weak_ptr |
단순 참조 (생명주기 명확) | raw pointer / reference |
728x90