Quick answer: Async load of a save slot returns nullptr in the delegate? The slot doesn’t exist, the file is corrupted, or the USaveGame subclass has been renamed since the file was written.
A player tries to load ‘Quicksave’; the callback fires with nullptr. The class has since been refactored — the file’s class reference is invalid.
Verify the Slot Name
Slot names are case-sensitive. QuickSave ≠ Quicksave. Test with UGameplayStatics::DoesSaveGameExist before loading.
Class Renames Break Files
The save file embeds the USaveGame class path. Renaming the class invalidates old files. Either keep the old class as a redirector or version your saves explicitly.
Version Field
UPROPERTY()
int32 SaveVersion;Add a version field. On load, migrate old versions before the rest of the code reads. Drops the “mysterious null” failure mode.
Storage Disk Full
On consoles, saves can fail if storage is full or unavailable. Handle the nullptr path with a user message rather than silently dropping the save attempt.
Verifying
Old saves load. New saves load. Renamed classes have a working redirect or migration path.
“Null is mis-slot, class drift, or storage failure. Version saves and check exists first.”
Define a SaveVersion constant from project day one — retrofitting versioning after shipping saves is much harder than adding it early.