프로그래밍 언어/C++

[게임 프로그래머 입문 올인원] 모던 C++ 스마트 포인터 : weak_ptr (84강)

순정법사 2024.03.30

A. 모던 C++ 스마트 포인터

2. weak_ptr

a. weak_ptr이란? 

🌟 shared_ptr의 순환 참조를 방지하기 위해 사용

 

  • 객체를 소유하지 않고 참조만 할 수 있음
  • 객체의 수명을 연장하지 않으므로, 객체가 소멸되더라도 weak_ptr은 만료
  • 독립적이지 않고 shard_ptr에 의존적으로 사용됨
  •  shard_ptr 카운트는 날려도 되는지 여부를 카운팅함 

 

👉 shard_ptr이나 weak_ptr 둘 중 하나 골라서 사용하면 됨!

shared_ptr을 사용할 때 사이클이 발생하는 부분에 대해서만 깔끔하게 처리해주면 된다

 

b. weak_ptr의 개념

RefCountBlock이 분홍 블록, refcount가 분홍 +1, 아래 파란색 +1이 weak_ptr 포인터

 

이렇게 weak_ptr로 타겟을 설정하고

 

attack시 (함수 사용시) 객체가 있는지 없는지 체크해서 없다면 lock

 

캐스팅과 비슷, 널포인터이면 사용 X, 포인터이면 사용된다!

 

즉, 여기 파란색 weak_ptr이 있는지 확인해 날아가는지 여부를 확인 후 있다면 shard_ptr을 생성해준다

 

따라서 이렇게 들고 있었어도 깔끔하게 날라감!

 

이렇게 들고있어도 k1의 refcount는 1

 

 

3. unique_ptr

a. unique_ptr이란?

🌟 동적으로 할당된 메모리를 관리하는 스마트 포인터로, 해당 포인터가 소유하는 객체에 대해 단일 소유권을 가짐

 

  • 즉, 복사 X 이동 O 포인터
  • 매니저 클래스같은 곳에 사용하기 좋음
  • 거의 사용하지 않음

 

b. unique_ptr의 특징

  1. 단일 소유자: 특정 객체를 오직 한 번만 소유할 수 있으며, 소유권이 이전되거나 공유 X . 다른 std::unique_ptr으로 이동할 수 있지만, 복사될 수는 없음
  2. 자동 해제: 소유한 객체가 더 이상 필요하지 않을 때 자동으로 메모리를 해제. RAII(Resource Acquisition Is Initialization) 원칙을 따르므로 메모리 누수를 방지하는 데 도움이 됨
  3. Move 시맨틱스: 소유권을 이동시키는 move 시맨틱스를 지원. std::unique_ptr이 다른 std::unique_ptr로 이동될 때 소유권이 전달되며, 이전 포인터는 null 포인터로 만들어짐
  4. 배열 지원: std::unique_ptr은 배열과 같은 동적으로 할당된 메모리를 관리

 

⏳ 예제

#include <memory>

int main() {
    // 단일 객체에 대한 unique_ptr 생성
    std::unique_ptr<int> ptr(new int(42));

    // move 시맨틱스를 사용하여 소유권 이전
    std::unique_ptr<int> ptr2 = std::move(ptr);

    // 배열에 대한 unique_ptr 생성
    std::unique_ptr<int[]> arrPtr(new int[5]);

    // 자동 해제됨
    return 0;
}

 

 

 


출처 : https://www.inflearn.com/course/%EA%B2%8C%EC%9E%84-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8-%EC%9E%85%EB%AC%B8-%EC%98%AC%EC%9D%B8%EC%9B%90-rookiss#curriculum

 

[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버 -

어디부터 시작할지 막막한 게임 프로그래밍 입문자를 위한 All-In-One 커리큘럼입니다. C++, 자료구조/알고리즘, STL, 게임 수학, Windows API, 게임 서버 입문으로 이어지는 알찬 커리큘럼으로 게임 프

www.inflearn.com