Why is TActorIterator crashing UE?

I have a single actor subclass, HUDManager, in my persistent level, and I’m trying to give the player a reference to that actor so he can send and receive events:

AHUDManager* HUDManager;

	for (TActorIterator<AHUDManager> ActorItr(GetWorld()); ActorItr; ++ActorItr)
	{
		HUDManager = *ActorItr;
	}

This looks right to me based on rama’s tutorial, but UE crashes every time I try to run this- what am I doing wrong?

Crash log, as requested:

Unknown exception - code 00000001 (first/second chance not available)

"Assertion failed: CurrentWorld [File:c:\program files (x86)\epic games\4.8\engine\source\runtime\engine\public\EngineUtils.h] [Line: 183]
"

UE4Editor_Core!FDebug::AssertFailed() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.8\engine\source\runtime\core\private\misc\outputdevice.cpp:355]
UE4Editor_Projectname_834!FActorIteratorBase::FActorIteratorBase() [c:\program files (x86)\epic games\4.8\engine\source\runtime\engine\public\engineutils.h:185]
UE4Editor_Projectname_834!AMCharacter::AMCharacter() [c:\users\username\documents\unreal projects\projectname\source\projectname\mcharacter.cpp:72]
UE4Editor_HotReload!FHotReloadClassReinstancer::ReconstructClassDefaultObject() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.8\engine\source\developer\hotreload\private\hotreloadclassreinstancer.cpp:195]
UE4Editor_HotReload!FHotReloadClassReinstancer::RecreateCDOAndSetupOldClassReinstancing() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.8\engine\source\developer\hotreload\private\hotreloadclassreinstancer.cpp:232]
UE4Editor_HotReload!FHotReloadClassReinstancer::FHotReloadClassReinstancer() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.8\engine\source\developer\hotreload\private\hotreloadclassreinstancer.cpp:293]
UE4Editor_HotReload!FHotReloadClassReinstancer::Create() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.8\engine\source\developer\hotreload\private\hotreloadclassreinstancer.h:114]
UE4Editor_HotReload!FHotReloadModule::ReinstanceClass() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.8\engine\source\developer\hotreload\private\hotreload.cpp:873]
UE4Editor_CoreUObject!UClassReplaceHotReloadClasses() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.8\engine\source\runtime\coreuobject\private\uobject\uobjectbase.cpp:662]
UE4Editor_CoreUObject!ProcessNewlyLoadedUObjects() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.8\engine\source\runtime\coreuobject\private\uobject\uobjectbase.cpp:822]
UE4Editor_CoreUObject!TBaseStaticDelegateInstance::ExecuteIfSafe() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.8\engine\source\runtime\core\public\delegates\delegateinstancesimpl_variadics.inl:921]
UE4Editor_Core!TBaseMulticastDelegate::Broadcast() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.8\engine\source\runtime\core\public\delegates\delegatesignatureimpl_variadics.inl:1031]
UE4Editor_Core!FModuleManager::LoadModuleWithFailureReason() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.8\engine\source\runtime\core\private\modules\modulemanager.cpp:431]
UE4Editor_Core!FModuleManager::LoadModule() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.8\engine\source\runtime\core\private\modules\modulemanager.cpp:303]
UE4Editor_HotReload!FHotReloadModule::DoHotReloadInternal() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.8\engine\source\developer\hotreload\private\hotreload.cpp:679]
UE4Editor_HotReload!FHotReloadModule::DoHotReloadCallback() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.8\engine\source\developer\hotreload\private\hotreload.cpp:620]
UE4Editor_HotReload!TBaseRawMethodDelegateInstance<0,FHotReloadModule,TTypeWrapper cdecl(bool,enum ECompilationResult::Type),TArray,TArray,FOutputDevice & ptr64>::Execute() [d:\buildfarm\buildmachine++depot+ue4-releases+4.8\engine\source\runtime\core\public\delegates\delegateinstancesimpl_variadics.inl:492]
UE4Editor_HotReload!TBaseRawMethodDelegateInstance<0,FHotReloadModule,void cdecl(bool,enum ECompilationResult::Type),TArray,TArray,FOutputDevice & ptr64>::ExecuteIfSafe() [d:\buildfarm\buildmachine++depot+ue4-releases+4.8\engine\source\runtime\core\public\delegates\delegateinstancesimpl_variadics.inl:582]
UE4Editor_HotReload!FHotReloadModule::CheckForFinishedModuleDLLCompile() [d:\buildfarm\buildmachine
++depot+ue4-releases+4.8\engine\source\developer\hotreload\private\hotreload.cpp:1486]
UE4Editor_HotReload!FHotReloadModule::Tick() [d:\buildfarm\buildmachine
++depot+ue4-releases+4.8\engine\source\developer\hotreload\private\hotreload.cpp:433]
UE4Editor_UnrealEd!UEditorEngine::Tick() [d:\buildfarm\buildmachine
++depot+ue4-releases+4.8\engine\source\editor\unrealed\private\editorengine.cpp:952]
UE4Editor_UnrealEd!UUnrealEdEngine::Tick() [d:\buildfarm\buildmachine
++depot+ue4-releases+4.8\engine\source\editor\unrealed\private\unrealedengine.cpp:366]
UE4Editor!FEngineLoop::Tick() [d:\buildfarm\buildmachine
++depot+ue4-releases+4.8\engine\source\runtime\launch\private\launchengineloop.cpp:2359]
UE4Editor!GuardedMain() [d:\buildfarm\buildmachine
++depot+ue4-releases+4.8\engine\source\runtime\launch\private\launch.cpp:142]
UE4Editor!GuardedMainWrapper() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.8\engine\source\runtime\launch\private\windows\launchwindows.cpp:126]
UE4Editor!WinMain() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.8\engine\source\runtime\launch\private\windows\launchwindows.cpp:200]

Paste here stack trace from this crash.

Sure, I edited the main post and added it, mcharacter(72) is the line quoted above where the for loop starts.

Oh, hot reloading.

From where are you calling this piece of code? Constructor of some class?

Yep, this is from MCharacter’s constructor, and MCharacter is a subclass of ACharacter.

I think it is not safe to calling Iterators in constructors during hot reload, GetWorld() is probably returning nullptr especially for default objects:)

Try secure it with:

if(GetWorld())
{
 // run da iterator
}

or move iterator code to:

virtual void AActor::OnConstruction(const FTransform& Transform) {}

or check if object is default object

if (HasAnyFlags(RF_ClassDefaultObject) == false)
{
 //run da iterator
}

That is excellent advice, and does the trick perfectly- if you wanna repost as an answer, I’ll accept it real quick. Thank you so much!!

Sidenote: this is probably the fifth time in a week or two I’ve confused myself by forgetting that GetWorld() can return null :slight_smile:

Sure, converted to answer;0