【问题标题】:How do you stop an Object from being destroyed in a loop in Unreal C++?在 Unreal C++ 中,如何阻止对象在循环中被破坏?
【发布时间】: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-&gt;GetStringField,主GeoJsonObject 似乎被破坏了。在上面的示例中,我可以获得几何和类型。但是,一旦获取类型的值,几何值就会抛出错误“父地址无效”。

如何保持GeoJsonObject 活着?

【问题讨论】:

  • 我不熟悉 Unreal,但是(在 C++ 中)您看到的行为与 RawJsonValueArray[index]-&gt;AsObject() 按值返回对象一致,因此 GeoJsonObject = RawJsonValueArray[index]-&gt;AsObject() 中的赋值存储了一个指向具有生命周期的对象在语句完成时结束,即产生一个悬空指针/引用,因此访问其属性会产生未定义的行为。 [如果对象类型有一个operator SomeType * () 允许将此类对象隐式转换为指针,则这种情况更有可能]。
  • 我认为是这样的。有什么办法解决这个问题吗?
  • 这取决于您为什么认为GeoJsonObject 需要具有TSharedPtr&lt;FJsonObject&gt; 类型以及RawJsonValueArray[index]-&gt;AsObject() 实际返回的内容(我不知道)。我在推测,但一种选择是在循环体(而不是外部)中定义/初始化GeoJsonObject。例如(C++11 及更高版本)auto GeoJsonObject = RawJsonValueArray[index]-&gt;AsObject()(所以GeoJsonObject 是一个将在每次迭代中创建和销毁的对象,并且可能是一个副本而不是包装的指针)。您可能还需要使用. 而不是-&gt; 来访问其属性
  • 静态变量怎么样?静态变量不会破坏util程序退出?
  • 感谢您的建议,但没有奏效。我找到了一些可行的方法,但我不确定它是否是一个好的解决方案。

标签: c++ unreal-engine4


【解决方案1】:

这是新的循环

我创建了一个指针 * 指向从我的数组创建的新对象 然后我为新对象创建了一个变量 =,调用 Get 来检索引用。从这一点开始,我可以在不取消引用的情况下使用我的新变量。

for (int32 index = 0; index < RawJsonValueArray.Num(); index++)
        {
            
            TSharedPtr<FJsonObject>* JsonObject = new TSharedPtr<FJsonObject>(RawJsonValueArray[index]->AsObject());
            FJsonObject* GeoJsonObject = JsonObject->Get();

            TSharedPtr<FJsonObject> geometry = GeoJsonObject->GetObjectField("type");
            GLog->Log("asdfasdf");
            FString type = GeoJsonObject->GetStringField("type");
            TSharedPtr<FJsonObject> properties = GeoJsonObject->GetObjectField("properties");
            TSharedPtr<FJsonObject> layer = GeoJsonObject->GetObjectField("layer");
            FString source = GeoJsonObject->GetStringField("source");
        }

【讨论】:

    猜你喜欢
    • 2014-05-26
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    相关资源
    最近更新 更多