일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- stl
- C++
- 선택정렬
- dataasset
- 정렬
- 언리얼가비지컬렉터
- UML관련
- unorder_map
- 강참조
- 데이터애셋
- 스마트포인터
- 크리티컬섹션
- 프로그래머스
- enumasByue
- C++최적화
- BFS
- UE_LOG
- 알고리즘
- 람다사용정렬
- 자료구조
- moreeffectiveC++
- UE4 커스텀로그
- 람다
- 언리얼엔진구조체
- 정렬알고리즘
- 애셋로드
- UELOG
- map
- 델리게이트
- 약참조
- Today
- Total
기억을 위한 기록들
[UE4-CPP] UE4에서의 스마트포인터 3가지 본문
이전에 일반 C++에서의 스마트포인터에 대해 다뤄보았다.
hyo-ue4study.tistory.com/247?category=862971
이번엔 언리얼엔진에서 스마트포인터를 다뤄보자.
우선 간단하게 게임 인스턴스 클래스를 만들고,
임의의 클래스(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
'UnrealEngine > UE4 - CPP' 카테고리의 다른 글
[UE4-CPP] 애님 몽타주 BlendOut/Complete 델리게이트 사용 예 (2) | 2021.03.07 |
---|---|
[UE4-CPP] 델리게이트(delegate)란? (4) | 2021.03.07 |
[UE4-CPP] 스마트포인터 (0) | 2021.01.28 |
[UE4-CPP] UPROPERY()에 관하여 (0) | 2021.01.21 |
UFUNCTION()의 BlueprintImplementableEvent와 BlueprintNativeEvent (0) | 2021.01.14 |