Skip to content

Memory and Object Lifetime

This is one of the biggest mindset shifts for Unity developers.

Unreal Garbage Collection

Unity Version

In Unity, C# objects are managed by .NET garbage collection, while UnityEngine.Object has its own engine lifetime behaviour.

Unreal Version

In Unreal, many gameplay objects derive from UObject and are tracked by Unreal's garbage collector.

Key Difference

Unreal object lifetime depends heavily on reflected references and engine ownership rules, not only plain C++ scope rules.

UObject

UObject instances are usually created with NewObject.

UMyInventoryObject* Inventory = NewObject<UMyInventoryObject>(this);

SpawnActor

Actors live in a UWorld, so they are spawned with SpawnActor.

AEnemy* Enemy = GetWorld()->SpawnActor<AEnemy>(EnemyClass, SpawnTransform);

Destroy

Actors are usually removed with Destroy().

Destroy();

Do not use delete on Actors or normal UObject gameplay instances.

UPROPERTY References

For UObject references stored on reflected classes, use UPROPERTY so Unreal can see the reference.

UPROPERTY()
TObjectPtr<UUserWidget> ActiveWidget;

Raw Pointers

Raw pointers still appear everywhere in Unreal APIs.

That does not automatically mean manual ownership.

AActor* TargetActor = nullptr;

When stored as members on reflected classes, pair object references with UPROPERTY or the project-standard reflected pointer style.

TObjectPtr

TObjectPtr is a UE5-friendly wrapper for reflected UObject member references.

UPROPERTY(EditAnywhere)
TObjectPtr<UStaticMesh> PreviewMesh;

TWeakObjectPtr

Use TWeakObjectPtr when you need a non-owning reference to a UObject.

TWeakObjectPtr<AActor> CachedTarget;

This is useful when the referenced object may go away and you do not want to keep it alive.

TSharedPtr and TUniquePtr

These are for regular C++ objects that are not managed by Unreal garbage collection.

TSharedPtr<FMyPlainData> SharedData = MakeShared<FMyPlainData>();
TUniquePtr<FMyPlainWorker> Worker = MakeUnique<FMyPlainWorker>();

Warning: TSharedPtr is generally not for owning UObject or AActor instances.

Common Mistake

A common trap is treating UObject references like normal heap objects and trying to manage them with new, delete, or TSharedPtr. For normal Unreal object ownership, use Unreal creation APIs and reflected references.