У меня есть некоторый код, который создает вектор строк в одной функции, преобразует его в TArray<FString>
, присваивает его переменной-члену объекта и добавляет этот объект в TArray
, как показано ниже:
void MyMethod() {
std::vector<std::string> vec = GetVec();
TArray<FString> arr = VecStrToTArrFStr(vec);
MyObject obj;
obj.value = arr;
this->Objects.Add(obj);
}
Где функция VecStrToTArrFStr
выглядит следующим образом:
inline TArray<FString> VecStrToTArrFStr(std::vector<std::string> &vec) {
TArray<FString> arr;
arr.SetNumUninitialized(vec.size());
for (auto &item : vec) {
arr.Add(FString(UTF8_TO_TCHAR(item.c_str())));
}
return arr;
}
Эта проблема возникает в этой строке:
this->Objects.Add(obj);
По какой-то причине копируется массивбросает сегфоВ частности, он дает этот стек вызовов:
__memcpy_avx_unaligned (@7fffec5b4ea0..7fffec5b5226:173)
FGenericPlatformMemory::Memcpy(void*, void const*, unsigned long) (/UnrealEngine/Engine/Source/Runtime/Core/Public/GenericPlatform/GenericPlatformMemory.h:348)
FMemory::Memcpy(void*, void const*, unsigned long) (/UnrealEngine/Engine/Source/Runtime/Core/Public/HAL/UnrealMemory.h:124)
TEnableIf<TIsBitwiseConstructible<wchar_t, wchar_t>::Value, void>::Type ConstructItems<wchar_t, wchar_t>(void*, wchar_t const*, int) (/UnrealEngine/Engine/Source/Runtime/Core/Public/Templates/MemoryOps.h:137)
void TArray<wchar_t, FDefaultAllocator>::CopyToEmpty<wchar_t>(wchar_t const*, int, int, int) (/UnrealEngine/Engine/Source/Runtime/Core/Public/Containers/Array.h:2508)
TArray<wchar_t, FDefaultAllocator>::TArray(TArray<wchar_t, FDefaultAllocator> const&) (/UnrealEngine/Engine/Source/Runtime/Core/Public/Containers/Array.h:338)
FString::FString(FString const&) (/UnrealEngine/Engine/Source/Runtime/Core/Public/Containers/UnrealString.h:73)
TEnableIf<!(TIsBitwiseConstructible<FString, FString>::Value), void>::Type ConstructItems<FString, FString>(void*, FString const*, int) (/UnrealEngine/Engine/Source/Runtime/Core/Public/Templates/MemoryOps.h:126)
void TArray<FString, FDefaultAllocator>::CopyToEmpty<FString>(FString const*, int, int, int) (/UnrealEngine/Engine/Source/Runtime/Core/Public/Containers/Array.h:2508)
TArray<FString, FDefaultAllocator>::TArray(TArray<FString, FDefaultAllocator> const&) (/UnrealEngine/Engine/Source/Runtime/Core/Public/Containers/Array.h:338)
MyObject::MyObject(MyObject const&) (MyObject.h)
int TArray<MyObject, FDefaultAllocator>::Emplace<MyObject const&>(MyObject const&&&) (/UnrealEngine/Engine/Source/Runtime/Core/Public/Containers/Array.h:1843)
TArray<MyObject, FDefaultAllocator>::Add(MyObject const&) (/UnrealEngine/Engine/Source/Runtime/Core/Public/Containers/Array.h:1916)
Все отлично работает, если я поменяю MyObject.value
навведите std::vector<std::string>
и просто присвойте ему vec
, но попытка присвоить ему TArray<FString>
приводит к сбою.
Что может быть причиной этого?Это как-то связано с тем, как я создаю свои FString
объекты, или как я создаю TArray
?UE4 выполняет сборку мусора на TArray
в VecStrToArrFStr
или что-то в этом роде?