place umg in umg, new release 4.20 will trigger exception when play pie


  in the new release 4.20, our project encounter a problem when migrating. some of our umg assets inlcude another umg within it. so if i change the inner umg instance properties, then play in pie , thus will trigger exception in SObjectWidget::~SObjectWidget, I have inspect the source code,  i found SObjectWidget::~SObjectWidget is not allowed to call when gc now, but in this situation, the inner umg wrapper sobjectwidget will destruct in the it's WidgetObject gc progress. 

  now  i have known the principle of ue4 design, that's all slate assets must release before uobject's gc, so if the outermost slate removed from viewport, the innner SObjectWidget will call ReleaseSlateResources recrusively for all it's child UWidget object, thus, UWidget will decrease  ref counter of  it's corresponding slate instance,  then if the outermost slate widget removed and if the ref counter is identical with zero, so it will destruct, all the child widgets will decrease ref counter by one,  of all the child widget certain one will destruct if  it's ref counter be zero. so if we release our reference of these widgets in our code if we have this time,  all the child widgets ref counter will be zero and be destruct, the sobjectwidget object will be the same. but now is not uobject's gc time, so SObjectWidget::~SObjectWidget will not trigger exception. then SObjectWidget will set it's member WidgetObject be null in it's destructor, when WidgetObject gc come next tick,  it's BeginDestroy is called, but this time it's member MyGCWidget (it's a SObjectWidget  and it's UUserWidget's wrapper, and it's a weakptr) is invalid, because it released before. so the gc progress won't call SObjectWidget::~SObjectWidget.

   now,  back to my question, i also trace the actions of UMG when play in pie, i found if i change inner umg properties or add new umg in outer umg, it will be recompiled, and inner umg will be add into OldToNewInstanceMap, the inner umg instance name will be [OBJECTNEMAE]_REINST,  and when SObjectWidget::AddReferenceObject is called, it's member WidgetObject will be replaced to another one from OldToNewInstanceMap, but its RootWidget's corresponding slate ref is null in WidgetTree of the new one. thus,  when play,  the outer umg wrapper sobjectwidget is destruct,  ReleaseSlateResources will called recrusively, in this time,  the outer umg's RootWidget int WidgetTree will not cause it's corresponding slate ref decrease by one, because it's corresponding slate ref is null, thus cause it's corresponding slate instance won't be release, at least in this time. So it child widgets wont's release including child umg's SObjectWidget. then child umg's SObjectWidget will release in it's WidgetObject gc call time in following progress. 
     so how to solve this problem, i also know  comment  assertion in SObjectWidget::~SObjectWidget roughly, but it's unreasonable  apparently, because the new release add this specially.