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 |
댓글