【发布时间】:2021-11-09 00:17:25
【问题描述】:
下面是我的代码:
void test::ParseGeoJson(const FString& File)
{
FString JsonString; //Json converted to FString
FFileHelper::LoadFileToString(JsonString, *File);
TArray<TSharedPtr<FJsonValue>> RawJsonValueArray;
TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(*JsonString);
bool success = FJsonSerializer::Deserialize(Reader, RawJsonValueArray);
if (success)
{
TSharedPtr<FJsonObject> GeoJsonObject;
for (int32 index = 0; index < RawJsonValueArray.Num(); index++)
{
GeoJsonObject = RawJsonValueArray[index]->AsObject();
TSharedPtr<FJsonObject> geometry = GeoJsonObject->GetObjectField("geometry");
FString type = GeoJsonObject->GetStringField("type");
TSharedPtr<FJsonObject> properties = GeoJsonObject->GetObjectField("properties");
TSharedPtr<FJsonObject> layer = GeoJsonObject->GetObjectField("layer");
FString source = GeoJsonObject->GetStringField("source");
}
}
}
GeoJsonObject 表示该数组索引处的对象。
然后我尝试获取GeoJsonObject 的属性。这确实有效。
当我的代码移动到使用GeoJsonObject 的下一行时,例如GeoJsonObject->GetStringField,主GeoJsonObject 似乎被破坏了。在上面的示例中,我可以获得几何和类型。但是,一旦获取类型的值,几何值就会抛出错误“父地址无效”。
如何保持GeoJsonObject 活着?
【问题讨论】:
-
我不熟悉 Unreal,但是(在 C++ 中)您看到的行为与
RawJsonValueArray[index]->AsObject()按值返回对象一致,因此GeoJsonObject = RawJsonValueArray[index]->AsObject()中的赋值存储了一个指向具有生命周期的对象在语句完成时结束,即产生一个悬空指针/引用,因此访问其属性会产生未定义的行为。 [如果对象类型有一个operator SomeType * ()允许将此类对象隐式转换为指针,则这种情况更有可能]。 -
我认为是这样的。有什么办法解决这个问题吗?
-
这取决于您为什么认为
GeoJsonObject需要具有TSharedPtr<FJsonObject>类型以及RawJsonValueArray[index]->AsObject()实际返回的内容(我不知道)。我在推测,但一种选择是在循环体(而不是外部)中定义/初始化GeoJsonObject。例如(C++11 及更高版本)auto GeoJsonObject = RawJsonValueArray[index]->AsObject()(所以GeoJsonObject是一个将在每次迭代中创建和销毁的对象,并且可能是一个副本而不是包装的指针)。您可能还需要使用.而不是->来访问其属性 -
静态变量怎么样?静态变量不会破坏util程序退出?
-
感谢您的建议,但没有奏效。我找到了一些可行的方法,但我不确定它是否是一个好的解决方案。
标签: c++ unreal-engine4