관리 메뉴

기억을 위한 기록들

[UE4-CPP] UE4에서의 스마트포인터 3가지 본문

UnrealEngine/UE4 - CPP

[UE4-CPP] UE4에서의 스마트포인터 3가지

에드윈H 2021. 2. 23. 23:51

이전에 일반 C++에서의 스마트포인터에 대해 다뤄보았다.

hyo-ue4study.tistory.com/247?category=862971

 

[CPP]스마트(Smart) 포인터에 관하여(1) - unique_ptr

스마트 포인터는 3가지가 있다. - unique_ptr (유니크) - shared_ptr (쉐어드) - weak_ptr (위크) 우선 일반 포인터를 보면 //... int main() { Vector* myVector = new Vector(10.f, 30.f); //... delete myVecto..

hyo-ue4study.tistory.com

이번엔 언리얼엔진에서 스마트포인터를 다뤄보자.

 

우선 간단하게 게임 인스턴스 클래스를 만들고,

임의의 클래스(House)(언리얼엔진에서 일반클래스 접두사 F)를 생성해주었다.

 

0. 일반 포인터

 Init에서 우선 일반 포인터처럼 생성과 해제를 해본다.

 

해당 게임 인스턴스를 설정해주고 플레이하게 되면 아래처럼 로그가 찍히는걸 볼 수 있다.

 

일반 포인터는 이런식으로 할당을 해주고 해제(delete)를 해줘야하는데, 해주지 않게 되면 문제(Memory leak 등)가 된다.

 

 

언리얼 엔진에서의 스마트포인터는 이전에 작성한 일반 CPP 스마트포인터와 별개로

언리얼엔진에서는 T로 시작하는 라이브러리로 제공을 해주고 있다. 마찬가지 3개가 있다.

 

 

1. 유니크포인터 (TUniquePtr)

2. 공유포인터 (TSharedPtr)

3. 약한포인터 (TWeakPtr)

 

 

 1. 유니크 포인터(TUniquePtr)

 

다른 유니크포인터에게 넘겨줄때엔 C++에서는 무브시멘틱(Move Semantic)이라고 하는데,

언리얼에서는 MoveTemp 함수로 넘겨준다.

 

실행시 로그를 확인해보면

정상적으로 출력되는걸 확인할 수 있다.

2. 공유 포인터(TSharedPtr)

우선 House 클래스에 참조용 공유 포인터변수를 추가 해주었다.

 

친구에게 공유될때(37번줄) 참조 카운팅이 증가하여 IsUnique() 2로 되어 false를 반환한다.(1일 경우 true)

 

 

 

순서대로 찍히는 모습.

 

 

2. 1 공유 포인터의 문제점

공유 포인터는 남에게도 공유가 가능하다. 그런데 만약에 서로 공유(참조)하게 된다면? 

 

41번째줄은 스코프를 벗어났는데 아래보면 myHouse와 friendHouse는 여전히 참조되어있다.

 

 

 소유권을 포기하니깐 쓰레기값이 나왔다. 여기서 도움되는게 바로 당므에 나오는 약 포인터이다.

 

3. 약포인터(TWeakPtr) 사용

우선 House 클래스에 공유포인터 말고 약포인터 멤버변수를 추가해준다

이렇게하고 실행시

이젠 정상적으로 쓰레기값이 바로 출력이 된다.

 

 

 

 

 

 

참고:

m.blog.naver.com/destiny9720/220951194710

 

[1-13] 스마트 포인터 삼총사와 메모리 관리

안녕하세요,이번이 언리얼 C++ 기초 강좌의 마지막이 될 것 같습니다. 마지막으로 정리한 내용은 언리얼 ...

blog.naver.com