공부 잡동사니/Unreal Engine

TSharedPtr, TWeakPtr

gamzachips 2023. 6. 28.
class Knight : public RefCountable
{
public: 
	int hp = 10;
}

 

TSharedPtr<Knight> k1 = TSharedPtr<Knight>(new Knight);
k1->ReleaseRef();

TSharedPtr은 임의로 하나를 빼줘야 RefCount 1로 시작됨 

 

복사될 때 ref count +1 

소멸될 때 ref count -1

 

aomic타입은 멀티스레드에서 안전하게 돌아가지만 속도가 느리다 .

ref +1, -1 하는 부분이 생각보다 느릴 수 있어서 스마트포인터를 매개변수로 넘겨줄 때 참조로 넘기는 것이 좋다. 

복사가 일어나지 않으므로 ref count가 늘어나지 않기 때문이다. 

 

 

하지만 SharedPtr의 문제점 ! 상호참조. 

k1이 k2를 가지고 있고, k2가 k1를 가지고 있을 때. 

서로 해제를 안 해주므로 절대 소멸이 안 된다. -> 메모리 릭 

 

weak pointer는 shared pointer의 문제를 보완하기 위한 것. 

shared pointer count와 함께, weak pointer count를 추가로 가지고 있음 ??

객체 소멸에는 영향을 주지 않음  ?? 

객체가 날아갔는지 여부를 알 수 있다?? 

 

C++ 표준에서는 lock을 이용해서 shared_ptr로 다시 변환해서 nullptr인지 체크 

 

 

언리얼에서 일반 클래스에 대해서 new/ delete 사용해도 될까? 

수동으로 사용하면 안 된다. 스마트 포인터 사용해야 함 

언리얼에서는 TSharedPtr 사용하면 된다. 

lock대신 Pin 함수 사용해서 변환. 

 

SharedPtr을 사용할 때는 this를 사용하면 안 된다. 

표준에서는 : public enable_shared_from_this<Knight>  

언리얼에서는 : public TSharedFromThis<Knight>

SharedFromThis() 함수를 이용해서 사용 

 

 

'공부 잡동사니 > Unreal Engine' 카테고리의 다른 글

AI  (0) 2023.07.10
Garbage Collector  (0) 2023.06.28
UI 데이터 바인딩, UI 설계  (0) 2023.06.26
충돌- interface  (0) 2023.06.24
충돌 - C++ / delegate  (0) 2023.06.23

댓글