【发布时间】:2019-07-15 16:10:15
【问题描述】:
我有一些代码在一个函数中创建字符串向量,将其转换为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 是在 VecStrToArrFStr 中的 TArray 上做一些垃圾收集吗?
【问题讨论】:
标签: arrays c++11 unreal-engine4