I fix this problem by modifing a little bit of code. I see that if I bind a common member function of a common class to a delegate by CreateSP(pCommonClassObject, &FCommonClass::FnName), then all is right.
class FReceiverWrapper : public TSharedFromThis<FReceiverWrapper>
{
public:
FReceiverWrapper(UXXXComponent* pComp) : HolderObject(pComp) {}
void OnFrame(BvhDataHeader* Header, float* Data )
{
UXXXComponent* Comp = HolderObject.Get( );
if (Comp)
{
Comp->OnFrameCallback( Header, Data );
}
}
private:
TWeakObjectPtr<UXXXComponent> HolderObject;
};
class UXXXComponent : public UActorComponent
{
// ...
public:
void OnFrameCallback(BvhDataHeader* Header, float* Data)
{
// parse the data here
}
BeginPlay()
{
RecvWrapper = MakeShared<FReceiverWrapper>(this);
DelegateObj.Add(
XXXDelegate::CreateSP(
RecvWrapper.Get(),
&FReceiverWrapper::OnFrame));
}
private:
TSharedPtr<FReceiverWrapper> RecvWrapper;
XXXDelegate DelegateObj;
}