BPの関数内でMap変数に存在しないキーでFindノードを使用すると、メモリリークする

お世話になっております。

BPの関数内でMap変数にFindノードを使用すると、メモリ使用量が増え続ける時があることを確認しています。

具体的には、キーが列挙型、値が構造体のMap変数を持つBPの関数で、Map変数に存在しないキーでFindノードを実行すると、メモリリークが発生します。

確認した所、関数実行開始時にFindノードの数だけ、デフォルトの構造体の確保が行われますが、

関数が実行されて、Map変数に存在しないキーでFindノードが呼び出されると、再度デフォルトの構造体が関数実行開始時のアドレスを使用して確保されます。

これにより、構造体の初期化時にメモリ割り当てが行われる場合、その解放が行われる機会がなくなり、メモリリークが起きているようでした。

このメモリリークについて、対応が行われたCLや課題化の情報があれば、教えていただけないでしょうか。

また、UE5.5.4でも再現が確認できたため、ブランクのテンプレートから作成したサンプルプロジェクトを再現確認用に添付いたします。

BP_MemoryLeakTestのMemoryLeakTest関数において、「Working」のキーでFindノードを呼び出した時にメモリリークが発生します。

また、Map変数の値に使用している構造体に「EngineMisc」のLLMタグを設定しているので、Stat ​LLMFULLのコンソールコマンドでメモリ使用量が増加して行く様子を確認できます。

お手数をお掛けして恐縮ですが、ご確認をよろしくお願いいたします。​

再現プロジェクトのご用意ありがとうございます。問題が確認できたので UE-272934 Calling UBlueprintMapLibrary::GenericMap_Find with a non-existent key causes a memory leak としてバグ登録いたしました。

正式な対応はUE5.6以降となりますが、以下のワークアラウンドが機能することを確認しております。大変お手数ですがお使いのエンジンにご適用いただけますでしょうか。

bool UBlueprintMapLibrary::GenericMap_Find(const void* TargetMap, const FMapProperty* MapProperty, const void* KeyPtr, void* OutValuePtr) { if(TargetMap) { FScriptMapHelper MapHelper(MapProperty, TargetMap); uint8* FoundValuePtr = MapHelper.FindValueFromHash(KeyPtr); if (OutValuePtr) { if (FoundValuePtr) { MapProperty->ValueProp->CopyCompleteValueFromScriptVM(OutValuePtr, FoundValuePtr); } else { #if 1 //ワークアラウンド MapProperty->ValueProp->ClearValue(OutValuePtr); #else MapProperty->ValueProp->InitializeValue(OutValuePtr); #endif } } return FoundValuePtr != nullptr; } return false; }

はい。数営業日ののちにUnrealEngineIssuesに公開予定です。

早速のご回答、誠にありがとうございます。

ワークアラウンドを適用することで、メモリリークが修正されることを確認できました。

UE-272934で正式な対応が入るまでは、ご提示いただいたワークアラウンドで問題を回避したいと思います。

UE-272934についてですが、今後Unreal Engine Issuesで追跡可能になる予定はありますか。

課題が公開される予定があれば、そちらで対応状況を追跡したいと考えております。

よろしくお願いいたします。

承知いたしました。ありがとうございます。

Unreal Engine Issuesで公開されましたら、そちらで対応状況を追跡したいと思います。

この度は迅速なご回答とご対応、大変助かりました。​よろしくお願いいたします。