08.28 - TIL

김혁·2025년 8월 28일

TIL

목록 보기
6/84

오늘의 코드카타

인사고과 (LV3)

  • 두 가지 정렬 조건을 통한 구분하기
  • 한 번에 바로 아이디어를 생각하지 못 했음 (복습 필요)
    -> 문제 풀이

오늘의 공부

학습한 강의

  • 챕터 6
    • RPC 실습
      • Server RPC, Client RPC, NetMulticast RPC
      • Property Replication
  • 챕터 7
    • 애니메이션 동기화
    • 공격 동기화

오늘의 CS

스마트 포인터의 종류와 특징

  • unique_ptr
    • 하나의 리소스에 대한 유일한 소유권을 가짐
    • 복사 불가, 이동만 가능(move)
    • 소유권이 이전되면 이전 포인터는 nullptr로 바뀜
    • RAII 기반으로, 소멸 시 자동으로 delete 호출
  • shared_ptr
    • 하나의 리소스를 여러 포인터가 공유 가능
    • 내부적으로 참조 카운터를 관리
    • 마지막 shared_ptr가 소멸될 때 리소스를 해제
  • weak_ptr
    • shared_ptr과 함께 사용되면서, 리소스에 소유권을 갖지 않는 약한 참조
    • shared_ptr의 참조 카운트를 증가시키지 않음 -> 순환 참조 방지
    • lock()을 통해 일시적으로 shared_ptr로 승격해서 사용 (리소스가 해제되었으면 nullptr 반환)

-> 모두 내부적으로 Raw 포인터를 감싸고 있으므로, nullptr을 가질 수 있다.
-> 다만 주의할 점으로 weak_ptr은 명시적으로 = nullptr로 선언할 수는 없다.

shared_ptr에서의 순환 참조

  • shared_ptr는 내부적으로 참조 카운트를 이용해서 리소스 해제 시점을 결정
  • 두 객체가 서로를 shared_ptr로 소유하면, 참조 카운트가 0이 되지 않아 메모리 누수가 발생
  • 이를 해결하기 위해 weak_ptr을 사용하여 리소스를 해제시킬 수 있음

weak_ptr::lock() 동작 과정

  1. 내부적으로 weak_ptr이 가리키고 있는 객체의 제어 블록을 확인함
  2. 그 객체가 아직 살아있으면 새로운 shared_ptr을 생성해서 반환
  3. 객체가 이미 소멸됐다면, nullptr을 담은 shared_ptr을 반환
profile
게임 개발자를 향해..

0개의 댓글