UE4 C ++ - Добавление объекта с членом `TArray` по значению к` TArray` вызывает ошибку - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть некоторый код, который создает вектор строк в одной функции, преобразует его в 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 или что-то в этом роде?

1 Ответ

0 голосов
/ 21 февраля 2019

Вы заполнили массив мусором FString объектов;когда вы вызываете TArray::Add, конструктор копирования FString пытается выполнить побитовое копирование своих элементов, что приводит к разыменованию указателя мусора, вызывая sigsegv.

Для разрешения удалите вызов SetNumUninitialized;это не делает то, что вы думаете, что делает.Этот вызов не просто резервирует пространство, вы фактически добавляете указанное количество мусора (неинициализированный) FStrings в массив, а затем помещаете «настоящие» в их конец.Посмотрите, в каком состоянии находится ваш массив после вызова VecStrToTArrFStr.

https://api.unrealengine.com/INT/API/Runtime/Core/Containers/TArray/SetNumUninitialized/index.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...