Arrays UE4 C++;-将具有“TArray”成员(按值)的对象添加到“TArray”会导致segfault

Arrays UE4 C++;-将具有“TArray”成员(按值)的对象添加到“TArray”会导致segfault,arrays,c++11,unreal-engine4,Arrays,C++11,Unreal Engine4,我有一些代码,可以在一个函数中创建字符串向量,将其转换为TArray,将其分配给对象的成员变量,并将该对象添加到TArray,如下所示: void MyMethod() { std::vector<std::string> vec = GetVec(); TArray<FString> arr = VecStrToTArrFStr(vec); MyObject obj; obj.value = arr; this->Objects.

我有一些代码,可以在一个函数中创建字符串向量,将其转换为
TArray
,将其分配给对象的成员变量,并将该对象添加到
TArray
,如下所示:

void MyMethod() {
   std::vector<std::string> vec = GetVec();
   TArray<FString> arr = VecStrToTArrFStr(vec);

   MyObject obj;
   obj.value = arr;

   this->Objects.Add(obj);
} 
此问题发生在以下行:

this->Objects.Add(obj);
出于某种原因,复制数组会引发segfault。具体来说,它给出了以下调用堆栈:

  • \uuu memcpy\uavx\u未对齐(@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::Type ConstructItems(void*,wchar\t const*,int)(/UnrealEngine/Engine/Source/Runtime/Core/Public/Templates/MemoryOps.h:137)
  • void TArray::CopyToEmpty(wchar_t const*,int,int,int)(/UnrealEngine/Engine/Source/Runtime/Core/Public/Containers/Array.h:2508)
  • TArray::TArray(TArray 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::Value),void>:键入ConstructItems(void*,FString const*,int)(/UnrealEngine/Engine/Source/Runtime/Core/Public/Templates/MemoryOps.h:126)
  • void TArray::CopyToEmpty(FString const*,int,int,int)(/UnrealEngine/Engine/Source/Runtime/Core/Public/Containers/Array.h:2508)
  • TArray::TArray(TArray const&)(/UnrealEngine/Engine/Source/Runtime/Core/Public/Containers/Array.h:338)
  • MyObject::MyObject(MyObject const&)(MyObject.h)
  • int TArray::Emplace(MyObject const&&&)(/UnrealEngine/Engine/Source/Runtime/Core/Public/Containers/Array.h:1843)
  • TArray::Add(MyObject const&)(/UnrealEngine/Engine/Source/Runtime/Core/Public/Containers/Array.h:1916)
如果我将
MyObject.value
更改为
std::vector
类型,并将其分配为
vec
,但尝试将其分配为
TArray
会抛出一个segfault,那么一切都会正常运行


这可能是什么原因造成的?它是否与我如何创建
FString
对象有关,或者与我如何创建
TArray
有关?UE4是在
vecstrtarrfstr
中的
TArray
上执行垃圾收集还是什么?

您已经用垃圾
FString
对象填充了数组;调用
TArray::Add
时,
FString
copy构造函数尝试对其成员执行按位复制,从而取消对垃圾指针的引用,从而导致sigsegv

要解决此问题,请删除对
setnuminitialized
的调用;它不会做你认为它会做的事。这个调用不仅仅是保留空间,实际上是将指定数量的垃圾(未初始化)
fstring
添加到数组中,然后将“真实”垃圾放在它们的末尾。在调用
VecStrToTArrFStr
后,查看数组的最终状态


啊,就是这样。谢谢
this->Objects.Add(obj);