【问题标题】:Destroying json array in delphi在delphi中销毁json数组
【发布时间】:2021-12-03 06:37:07
【问题描述】:

下面的代码会造成内存泄漏。 正确的方法是什么?

  JSONArray := TJSONArray.Create;
  try
    JSONArray :=
      TJSONObject.ParseJSONValue(
        TEncoding.UTF8.GetBytes(
          '[{"username":"admin"},{"username":"developer"}]'
        ), 0
      ) as TJSONArray;
  finally
    JSONArray.Free;
  end;

【问题讨论】:

    标签: arrays json delphi destroy


    【解决方案1】:

    问题是对TJSONArray.Create 的调用。您正在创建自己的 TJSONArray 对象,然后覆盖 JSONArray 指针以指向完全不同的 TJSONArray 对象,从而泄漏您 Create'd 的原始对象。

    所以,只需摆脱 Create 电话,您就不需要它了。你只需要FreeParseJSONValue()返回的对象。

    此外,您不需要将 JSON 字符串转换为字节。 ParseJSONValue() 有一个接受 string 作为输入的重载。

    试试这个:

    JSONArray := TJSONObject.ParseJSONValue(
      '[{"username":"admin"},{"username":"developer"}]'
    ) as TJSONArray;
    try
      // ...
    finally
      JSONArray.Free;
    end;
    

    【讨论】:

      【解决方案2】:

      作为提供的有效解决方案的替代方案,但使用mORMot。恕我直言,更简单、更清洁并避免内存泄漏:

      program Project1;
      
      {$APPTYPE CONSOLE}
      
      uses
        Syncommons;
      
      var Json : TDocVariantData;
      begin
        Json.InitJSon('[{"username":"admin"},{"username":"developer"}]');
        // Testing
        assert(Json.Kind = dvArray);
        assert(Json.Count = 2);
        assert(TDocVariantData(Json.Values[1]).U['username'] = 'developer');
      end.
      

      请找到更多详细信息和替代方案in the amazing documentation

      【讨论】:

        猜你喜欢
        • 2015-10-19
        • 2011-09-22
        • 2011-06-17
        • 2011-12-22
        • 1970-01-01
        • 2015-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多