프로그래밍 언어/C++

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

순정법사 2024.03.30

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

메모리 관리를 보다 효율적으로 처리하기 위해 사용

모두 <memory> 헤더 파일에 정의

 

1. shared_ptr

a. shared_ptr이란?

🌟 동적으로 할당된 메모리를 가리키는 포인터

 

  • 여러 개의 shared_ptr이 같은 객체를 가리킬 때, 해당 객체는 참조 카운트(reference count)를 유지하며, 객체를 참조하는 shared_ptr의 수를 추적
  • 객체를 참조하는 shared_ptr이 모두 소멸될 때, 객체가 자동으로 메모리에서 해제
  • 순환 참조(circular reference)를 방지하기 위해 메모리 누수를 방지
  • 스마트 포인터의 비중 99%
  • 섞어쓰면 안되고 shard_ptr을 쓰면 계속 똑같이 써야 함

 

🧡 래퍼 포인터

이런 느낌이랑 비슷하게 사용한다


포인터를 소멸시켜주는 클래스 생성

 

스택에서 소멸될때 알아서 실행된다

➡ 스마트포인터가 있어서 잘 사용하지 않음 

 

b. shard_ptr의 개념

 

내가 관리해야 하는 포인터를 받아서 들고있도록 하고, 카운트도 하기

 

k3 = k1 코드에서 refCount가 올라감

 

refCount를 따로 관리해주기

 

RefCountBlock 으로 수정하기, 1씩 늘어나게 코드 작성

 

위 코드에서 기본 생성자 추가해주고

 

k3 = k1처럼 복사가 일어날때 포인터 넘겨주기

 

복사 생성자도 추가해주기

 

여기까지 작성하면 더이상 따로 delete ~를 사용하지 않음

 

💙 Thread Safe 함!

사실 int가 아니라 atomic<int>라 safe하고 조금 더 느리다

 

c. 스마트 포인터를 참조값으로?

만약 스마트 포인터를 매개변수로 넘기면

 

여기서 증감된다 = 부담

 

따라서 스마트 포인터의 참조값으로 넣어주면 부담이 없음

 

어짜피 k1을 호출한 객체는 따로!

 

위 경우가 아닌 나머지 경우는 사용 XXX (일반 포인터와 동일해짐)

 

d. shared_ptr의 단점

 

이 코드를 그림으로 설명하면,

 

k1이 k2를 바라볼때 /  k1이 소멸되며 카운트가 자동으로 줄고

 

k2 소멸시 모두 소멸된다

 

하지만 이렇게 서로 바라보고 있다면

 

이런 느낌

 

이렇게 강제로 끊어줘야만 해결이 가능함

 

이걸 해결하기 위해 나온게 weak_ptr! (다음 강의)

 

 

 


출처 : 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