Function pointers in Unreal compared to standard C++. Getting an unexpected error which I cannot reproduce without UE4

I tried to reproduce this issue in a non Unreal Engine project, but I can’t seem to do it, so I’m quite unsure how to solve this, you can see how I [tried to reproduce it here.][1]

Anyhow, I’m trying to write a triggering gameplay system which works like this:

You have a trigger, can be anything, a volume trigger, a written button class which trigger something, a timed event or anything. That said trigger calls its trigger option class which only exists for the possibility of different usecases, some options at the top of my head: proxytrigger which instantly triggers, delayedtrigger which delays the trigger process, or something more complex like a trigger option that will only give you the OK sign if your health is 100%.

Once the TriggerOption tells the real Trigger that it’s been triggered, the TriggerAction will play, which can also be anything, a door opening perhaps? I wonder how many times I’ve said “trigger” by now … anyway, that’s the entire system. However, the process of TriggerOption telling TriggerActor (the actual trigger) that it should get triggered happens through a function pointer:

This is the function which sets up the function pointer:

void ATriggerActor::AttemptToTrigger()
{
	if (!TriggerOption)
	{
		UE_LOG(LogTemp, Error, TEXT("TriggerOption is nullptr in TriggerActor: %s?"), *GetName());
		return;
	}

	if (CanBeTriggered())
	{
		TriggerOption->StartTriggerOption(this, &ATriggerActor::OnTriggerOptionCompletedCB);
		bHasBeenTriggered = true;
		TriggerCount++;
	}
}

This is the function that calls it, or stores it or whatever this subclass wants to do with it, in this case, it just calls it.

void UTriggerOptionProxy::StartTriggerOption(ATriggerActor* CallbackOwner, VoidFuncPtrNoParams CompletionCB)
{
	(CallbackOwner->* (CompletionCB))();
}

This is also the typdef for the function pointer btw: typedef void(ATriggerActor::*VoidFuncPtrNoParams)(void);

When trying to call the function pointer,

, it throws this:

Exception thrown at 0x00007FF8A0954197 (UE4Editor-UE4Systems-3138.dll) in UE4Editor.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.

EDIT: Trying to fix the code format…

Hey,

Im not sure i understod fully what you want, but seems to me you try to overthink this a little bit :slight_smile:

What about delegates, timers, events, interfaces? :slight_smile:
Technically all of this things is designed to trigger functions at some point and they implemented properly so you can use it freely…

I know this is not what you asked, but maybe a good advice :wink:
but if you wanna go with function pointers, maybe this wiki helps: A new, community-hosted Unreal Engine Wiki - Announcements - Unreal Engine Forums

I realize this is quite an old topic, but I stumbled across this topic via Google and I am having the same problem as the OP. I have used function pointers like this in other code, but for some reason I cannot get it to work in Unreal Engine. I have a pointer to an owner (in my case, an object that derives from UActorComponent) and a pointer-to-member-function that points to a function that belongs to that owner’s class. But no matter how I do it, either invoking the function pointer directly or using std::invoke, an access violation exception is thrown similar to OP.

Hopefully someone can chime in with some helpful advice, because I’m feeling kind of stuck. The only interesting thing that I can point to to guide this discussion is that if I invoke the member function directly like this:

if( m_pOwner != nullptr && m_fpOwnerFunction != nullptr )
{
    ( m_pOwner->*m_fpOwnerFunction )( );
}

Then when the exception occurs, my call stack tells me that the exception is happening inside TBaseUObjectMethodDelegateInstance::ExecuteIfSafe. I don’t understand why this code would be executing since this section of code doesn’t reference delegates at all. I don’t see how this function call could possibly be going to a different place since I’m directly invoking a pointer-to-member-function (as opposed to potentially invoking an operator() overload that I’m unaware of).

I’ve been staring at this incredibly simple code for a few hours now and I have no idea why it won’t work. If anyone has any ideas, I would love to hear them.

Well, I figured out my problem after a night’s sleep and some troubleshooting. I’ll post the answer here if anyone else ends up having my problem and is googling. My issue was that I forgot to include the header file that defined m_pOwner’s type in the source file that was invoking m_fpOwnerFunction. I thought the compiler would have caught a mistake like this since usually accessing incomplete types causes a compilation error, but it didn’t throw warnings or errors this time. The delegate code that was in my call stack turned out to be irrelevant.