NativeDestruct + RemoveFromParent() = Crash on exit

,

From what you’ve described, the biggest problem is that you really only need to manually destroy the Second Widget when the first one is manually destroyed. Otherwise, things will happen automatically. That makes a solution fairly straightforward. Basically, just move the NativeDestruct logic into a BlueprintCallable method:

UFUNCTION(BlueprintCallable, Category = "CustomUserWidget")
void Close()
{
    if (SecondUserWidgetPointer)
    {
        SecondUserWidget->RemoveFromViewport();
    }
    RemoveFromViewport();
}

Then, you could do something like this in Blueprint (or anywhere else from C++):

Then, when you detect your widget has been moved, just call Close instead of directly removing it from the viewport.

94750-giphy.gif

Now, you’ve eliminated the issue. You know that when your code calls “Close” everything is valid. However, if the Widgets get destructed some other way, they aren’t doing anything dangerous.