티스토리 뷰

728x90
반응형
C++ 스마트 포인터 정리

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
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함