언리얼 엔진 4 C++ (TSharedPtr, TWeakPtr, TUniquePtr)
관리되지 않는 메모리
malloc() / free()
malloc() : 프로그램에서 메모리를 할당하기 위해 컴퓨터 시스템의 메모리 블록을 지정한다.
free() : 메모리를 시스템에 되돌려줘야 하기 때문에 메모리 해체 호출한다.
new / delete
new : 메모리가 할당된 직후에 생성된 객체에서 생성자 호출한다.
delete : new 연산자로 할당된 객체는 delete 연산자로 할당 해체돼야 한다.
관리되는 메모리
NewObject<>
NewObject<> : UE4에서는 메모리 관리가 자동적으로 수행하는데 엔진 내에서 사용할 객체의 할당은 NewObject<>를 사용하여 수행한다.
※ SpawnActor<> 경우에는 객체가 Actor나 Actor를 상속받는 객체여야만 한다.
ConditionalBeginDestroy()
ConditionalBeginDestroy() : NewObject<>를 사용해 상속 클래스를 메모리 할당한 경우 ConditionalBeginDestroy() 멤버 함수를 호출해 수동으로 해체한다. 이 명령은 BeginDestroy() 및 FinishDestroy()와 같은 오버라이드 가능한 함수를 호출해 메모리 해제 프로세스를 시작한다.
스마트 포인터(TSharedPtr, TWeakPtr, TUniquePtr)를 사용해 객체 추적
TSharedPtr : UObject 상속 클래스를 제외하고 모든 사용자 정의 C++ 객체를 참조 카운팅하는 유용한 C++ 클래스로 스레드에서 안전한 공유 객체를 나타내는 참조-계수 포인터 유형을 제공한다. 공유 객체는 더 이상 참조가 없을 때 할당 해제한다.
TWeakPtr : 객체의 삭제를 방지할 수 없는 이상한 속성을 가진 참조 카운트된 객체를 가리키기 위해 제공한다. Weak 포인터는 참조 횟수가 0으로 떨어지면 객체를 메모리에 유지할 수 없지만 객체가 수동으로 삭제될 때, Weak 포인터의 참조는 NULL로 참조된다.
TUniquePtr : 스레드에서 안전하지 않은 유니크 포인터로 복사 생성자가 호출될 경우 소유권이 이전된다. TUniquePtr을 스코프 포인터로 활용할 수 있다. 스코프 포인터는 블록이 선언된 블록의 끝에서 자동 삭제되는 포인터이다.
// 클래스 이름.h
#pragma once
#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "Action.generated.h"
/**
*
*/
UCLASS()
class CPP_PRACTICE_API UAction : public UObject
{
GENERATED_BODY()
public:
class MyClass {};
TSharedPtr<MyClass> sharedPtr();
TWeakPtr<MyClass> weakPtr();
TUniquePtr<UAction> action();
};
⊙ 언리얼 버전 : 4.26