0.最初
配列の長さより大きい所にInsertを行うとどのような挙動をするのか気になりました
テストBPは以下の感じ
・長さ3の配列
・100番目に文字列「DDD」を追加
以下の2点のどちらかが行われるだろうと予想しました
・指定したIndexの差分だけResizeされる
→長さ3の時Insertで100番目に追加する時、97個分の配列が確保される
・「配列の長さ分の場所に追加できません」的なエラーが表示され動作停止する
1.結果
以下のワーニングが表示され「Insert」ノードがスキップされました
Script Msg: Attempted to insert an item into array StrArray out of bounds [100/2]!
配列に項目を挿入しようとしました
2.解説
UKismetArrayLibrary 204行目
長さより大きいIndexを入力するとこの処理がスキップされます
void UKismetArrayLibrary::GenericArray_Insert(void* TargetArray, const FArrayProperty* ArrayProp, const void* NewItem, int32 Index)
{
if( TargetArray )
{
FScriptArrayHelper ArrayHelper(ArrayProp, TargetArray);
FProperty* InnerProp = ArrayProp->Inner;
if (ArrayHelper.IsValidIndex(Index)||(Index >= 0 && Index <= ArrayHelper.Num()) )
{
ArrayHelper.InsertValues(Index, 1);
InnerProp->CopySingleValueToScriptVM(ArrayHelper.GetRawPtr(Index), NewItem);
}
else
{
FFrame::KismetExecutionMessage(*FString::Printf(TEXT("Attempted to insert an item into array %s out of bounds [%d/%d]!"), *ArrayProp->GetName(), Index, GetLastIndex(ArrayHelper)), ELogVerbosity::Warning, InsertOutOfBoundsWarning);
}
}
}
3.結論
結論としては「ノードスキップ」でした
勝手にResizeされるだろうと思っていましたが
ミスした場合多くのメモリを消費されるのでよく考えればそんなこと無いなと思いましたね
4.参考資料