티스토리 뷰
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
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- DLL
- ReFS
- OpenSource
- 스쿠버다이빙
- Build
- C# 고급 기술
- 울릉도
- 패턴
- 서귀포
- 리눅스
- 블루버블다이브팀
- Thread
- C++
- 외돌개
- 제주도
- 블루버블
- C#
- CMake
- 암호화
- C
- 현포다이브
- 블루버블다이빙팀
- Windows
- 성산블루버블
- 윈도우
- Linux
- ip
- 서귀포블루버블
- PowerShell
- C#.NET
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함