언리얼엔진

언리얼 엔진 4 C++ (TSharedPtr, TWeakPtr, TUniquePtr)

대니스 2023. 1. 26. 16:37

관리되지 않는 메모리

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