Crash on exit: Garbage collector and ~StaticMesh problem

Hello. I’m having the following issue when the program is stopped, apparently is an error in the destructor of an actor that have a static mesh subcomponent.

In the constructor I’m allocating a static mesh from the information of an existing static mesh:

ACreadorLuces::ACreadorLuces()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;
	
	// Carga del material
	static ConstructorHelpers::FObjectFinder<UMaterial> MatObj(TEXT("Material'/Game/Materiales/MaterialEjemplo.MaterialEjemplo'"));
	if (MatObj.Succeeded()){
		BaseMat = MatObj.Object;
	}

	static ConstructorHelpers::FObjectFinder<UStaticMesh> cargadorModelo(TEXT("/Game/Modelos/basico_mm"));
	UStaticMesh* modelo;
	if (cargadorModelo.Succeeded()){
		modelo = cargadorModelo.Object;
	}
	else {
		return;
	}

	FStaticMeshSourceModel* sourceModel = &modelo->SourceModels[0];
	FRawMesh rawMesh;
	sourceModel->RawMeshBulkData->LoadRawMesh(rawMesh);
	
	for (int32 i = 0; i < rawMesh.FaceMaterialIndices.Num(); i++){
		rawMesh.FaceMaterialIndices[i] = 0;
	}
	
	// Creo nuevo modelo
	UStaticMesh* modeloNuevo = NewObject<UStaticMesh>();
	new(modeloNuevo->SourceModels) FStaticMeshSourceModel();
	modeloNuevo->SourceModels[0].RawMeshBulkData->SaveRawMesh(rawMesh);
	TArray<FText> BuildErrorsNuevo;
	modeloNuevo->Build(true, &BuildErrorsNuevo);
	modeloNuevo->MarkPackageDirty();

	// Asigno nuevo modelo
	modeloActor = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("ModeloActor"));
	modeloActor->SetStaticMesh(modeloNuevo);
}

.h:

class BOTONLUZ_API ACreadorLuces : public AActor
{
	GENERATED_BODY()

public:
	// Sets default values for this actor's properties
	ACreadorLuces();

	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

	// Called every frame
	virtual void Tick(float DeltaSeconds) override;

	virtual void PostInitializeComponents() override;

	UPROPERTY(Category = StaticMeshActor, VisibleAnywhere, BlueprintReadOnly,
		Meta = (ExposeFunctionCategories = "Mesh,Rendering,Physics,Components|StaticMesh", AllowPrivateAccess = "true"))
		UStaticMeshComponent * modeloActor;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Materials)
		UMaterial* BaseMat;
};

The problem is here, in the PostInitializeComponents function, because if I remove this function the Engine doesn’t crash. Maybe it’s related to the dynamic material instances:

void ACreadorLuces::PostInitializeComponents()
{
	Super::PostInitializeComponents();
	string s;
	if (!errorCargaModelo){
		if (BaseMat)
		{
			// Creo y agrego materiales a la lista del modelo
			MaterialInst = UMaterialInstanceDynamic::Create(BaseMat, this);
			modeloActor->SetMaterial(1, MaterialInst);
			FLinearColor color1 = FLinearColor::Yellow;
			MaterialInst->SetVectorParameterValue("baseColor", color1);

			MaterialInst = UMaterialInstanceDynamic::Create(BaseMat, this);
			modeloActor->SetMaterial(2, MaterialInst);
			FLinearColor color2 = FLinearColor::Black;
			MaterialInst->SetVectorParameterValue("baseColor", color2);

			// Obtengo y modifico rawmesh
			FStaticMeshSourceModel sourceModel = modeloActor->StaticMesh->SourceModels[0];
			FRawMesh rawMesh;
			sourceModel.RawMeshBulkData->LoadRawMesh(rawMesh);

			for (int32 i = 0; i < rawMesh.FaceMaterialIndices.Num(); i++){
				rawMesh.FaceMaterialIndices[i] = 1;
			}
			modeloActor->StaticMesh->SourceModels[0].RawMeshBulkData->SaveRawMesh(rawMesh);
			modeloActor->StaticMesh->PreEditChange(nullptr);
			TArray<FText> BuildErrors;
			modeloActor->StaticMesh->Build(true, &BuildErrors);
			modeloActor->StaticMesh->MarkPackageDirty();
		}
	}
	else {
		s = "Error al cargar modelo";
		GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, s.c_str());
	}
}

Crash report:

MachineId:D2BEF611456171CB171D15A4A42CB182
EpicAccountId:6ac59fa8cbb647a4b14c5a548cbd3b91

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

"Assertion failed: LockStatus == LOCKSTATUS_Unlocked [File:D:\BuildFarm\buildmachine_++depot+UE4-Releases+4.9\Engine\Source\Runtime\CoreUObject\Private\Seria

UE4Editor_Core!FDebug::AssertFailed() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.9\engine\source\runtime\core\private\misc\outputdevice.cpp:354]
UE4Editor_CoreUObject!FUntypedBulkData::~FUntypedBulkData() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.9\engine\source\runtime\coreuobject\private\serialization\bulkdata.cpp:125]
UE4Editor_Engine!TArray<FStaticMeshSourceModel,FDefaultAllocator>::~TArray<FStaticMeshSourceModel,FDefaultAllocator>() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.9\engine\source\runtime\core\public\containers\array.h:577]
UE4Editor_Engine!UStaticMesh::~UStaticMesh()
UE4Editor_Engine!UStaticMesh::`scalar deleting destructor'()
UE4Editor_CoreUObject!IncrementalPurgeGarbage() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.9\engine\source\runtime\coreuobject\private\uobject\garbagecollection.cpp:1152]
UE4Editor_CoreUObject!CollectGarbageInternal() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.9\engine\source\runtime\coreuobject\private\uobject\garbagecollection.cpp:1383]
UE4Editor_CoreUObject!CollectGarbage() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.9\engine\source\runtime\coreuobject\private\uobject\garbagecollection.cpp:1400]
UE4Editor_UnrealEd!UEditorEngine::EndPlayMap() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.9\engine\source\editor\unrealed\private\playlevel.cpp:327]
UE4Editor_UnrealEd!UEditorEngine::Tick() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.9\engine\source\editor\unrealed\private\editorengine.cpp:1579]
UE4Editor_UnrealEd!UUnrealEdEngine::Tick() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.9\engine\source\editor\unrealed\private\unrealedengine.cpp:366]
UE4Editor!FEngineLoop::Tick() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.9\engine\source\runtime\launch\private\launchengineloop.cpp:2428]
UE4Editor!GuardedMain() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.9\engine\source\runtime\launch\private\launch.cpp:142]
UE4Editor!GuardedMainWrapper() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.9\engine\source\runtime\launch\private\windows\launchwindows.cpp:126]
UE4Editor!WinMain() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.9\engine\source\runtime\launch\private\windows\launchwindows.cpp:200]

Problem solved. Editing the raw mesh in PostInitializeComponents function causes the crash of the engine.

Complete the rawMesh.FaceMaterialIndices array in the constructor, and set dynamic material instances to the static mesh calling the function modeloActor->SetMaterial(index, material) in the PostInitializeComponents function, solves the problem.

Constructor code:

ACreadorLuces::ACreadorLuces()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;
	errorCargaModelo = false;
	
	// Carga del material
	static ConstructorHelpers::FObjectFinder<UMaterial> MatObj(TEXT("Material'/Game/Materiales/MaterialEjemplo.MaterialEjemplo'"));
	if (MatObj.Succeeded()){
		BaseMat = MatObj.Object;
	}

	static ConstructorHelpers::FObjectFinder<UStaticMesh> cargadorModelo(TEXT("/Game/Modelos/basico_mm"));
	UStaticMesh* modelo;
	if (cargadorModelo.Succeeded()){
		modelo = cargadorModelo.Object;
	}
	else {
		errorCargaModelo = true;
		return;
	}

	FStaticMeshSourceModel* sourceModel = &modelo->SourceModels[0];
	FRawMesh rawMesh;
	sourceModel->RawMeshBulkData->LoadRawMesh(rawMesh);
	
	for (int32 i = 0; i < rawMesh.FaceMaterialIndices.Num(); i++){
		rawMesh.FaceMaterialIndices[i] = i;
	}
	
	// Creo nuevo modelo
	UStaticMesh* modeloNuevo = NewObject<UStaticMesh>();
	new(modeloNuevo->SourceModels) FStaticMeshSourceModel();
	modeloNuevo->SourceModels[0].RawMeshBulkData->SaveRawMesh(rawMesh);

	for (int32 i = 0; i < rawMesh.FaceMaterialIndices.Num(); i++){
		modeloNuevo->Materials.Add(BaseMat);
	}
	
	TArray<FText> BuildErrorsNuevo;
	modeloNuevo->Build(true, &BuildErrorsNuevo);
	modeloNuevo->MarkPackageDirty();

	// Asigno nuevo modelo
	modeloActor = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("ModeloActor"));
	modeloActor->SetStaticMesh(modeloNuevo);

}

PostInitializeComponents code:

void ACreadorLuces::PostInitializeComponents()
{
	Super::PostInitializeComponents();
	string s;
	if (!errorCargaModelo){
		if (BaseMat)
		{
			// Creo y agrego materiales a la lista del modelo
			MaterialInst = UMaterialInstanceDynamic::Create(BaseMat, this);
			FLinearColor color1 = FLinearColor::Yellow;
			MaterialInst->SetVectorParameterValue("baseColor", color1);

			for (int32 i = 0; i < 100; i++){
				modeloActor->SetMaterial(i, MaterialInst);
			}
		}
	}
	else {
		s = "Error al cargar modelo";
		GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, s.c_str());
	}
}