メモリリークの調査をしていたところ、コンソールコマンド「LinkerLoadList」の「LiveLinkers」で表示される
FLinkerLoad がレベル遷移のたびに増え続けていました。
さらに調査を行ったところ、大半は参照しているLinkerRoot(UPackage)の中身がnullptrでしたので、
UPackage関係を調べて以下のようにエンジンのコードを修正したら「LiveLinkers」を表示してもほとんど増えなくなりました。
Engine\Source\Runtime\CoreUObject\Private\UObject\Package.cpp
void UPackage::BeginDestroy()
{
// Detach linker if still attached
if (LinkerLoad)
{
#if 0
// 元のコード
LinkerLoad->Detach();
FLinkerManager::Get().RemoveLinker(LinkerLoad);
#else
// Detach()の内部で LinkerLoad に nullptr がセットされてしまうため、RemoveLinkerに渡すポインタを事前に保持
FLinkerLoad* Temp = LinkerLoad;
LinkerLoad->Detach();
FLinkerManager::Get().RemoveLinker(Temp);
#endif
LinkerLoad = nullptr;
}
Super::BeginDestroy();
}
こちらのような対処で問題ないでしょうか?