Quick answer: Unreal Blueprint UAsyncAction or Async Node leaking memory? You’re not calling SetReadyToDestroy() on completion paths, so the latent action stays referenced forever.
An online matchmaking Blueprint async node fires repeatedly. Each call adds an instance that’s never released. Memory and tick load creep up over a play session.
Mark Ready to Destroy
void UMyAsync::Activate() {
// kick off async work, on complete:
OnComplete.Broadcast(Result);
SetReadyToDestroy();
}Every code path that ends the async action — success, failure, cancel — must call SetReadyToDestroy or the engine’s ref retention keeps it alive.
Cancellation Paths
If the owner is destroyed mid-async, the action is orphaned but still ticking. Bind to the owner’s OnDestroyed and complete the action.
Use UCancellableAsyncAction
If you need a Cancel pin in Blueprint, derive from UCancellableAsyncAction — gives you the boilerplate for handling cancellation.
Verifying
Calling the async node 1000 times in a loop and waiting all complete leaves no leaked instances in Stat Memory.
“Every async action exit must call SetReadyToDestroy. Otherwise it leaks.”
Add a destructor-time log to your async actions during development — missing “destroyed” messages tell you exactly which paths are leaking.