You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi中销毁JSON数组代码存在内存泄漏的正确解决方法

内存泄漏原因

你代码的核心问题是重复创建对象导致首实例地址丢失:你先通过TJSONArray.Create生成了一个JSON数组实例赋值给变量,随后在try块内又将TJSONObject.ParseJSONValue返回的新JSON对象直接覆盖到同一个变量,最初创建的那个TJSONArray实例的内存地址再也找不到,无法被释放,就形成了内存泄漏。

正确实现

写法1(带类型校验,推荐)

var
  JSONArray: TJSONArray;
  LJSONValue: TJSONValue;
begin
  // Parse方法直接返回创建好的JSON对象,不需要提前创建实例
  LJSONValue := TJSONObject.ParseJSONValue(
    TEncoding.UTF8.GetBytes('[{"username":"admin"},{"username":"developer"}]'),
    0
  );
  try
    // 先做类型校验,避免JSON结构不符合预期时强转报错
    if not (LJSONValue is TJSONArray) then Exit;
    JSONArray := TJSONArray(LJSONValue);

    // 此处编写对JSONArray的业务处理逻辑

  finally
    // 统一释放Parse生成的对象即可
    LJSONValue.Free;
  end;
end;

写法2(简化版,仅适合确认JSON结构一定为数组的场景)

var
  JSONArray: TJSONArray;
begin
  JSONArray := TJSONObject.ParseJSONValue(
    TEncoding.UTF8.GetBytes('[{"username":"admin"},{"username":"developer"}]'),
    0
  ) as TJSONArray;
  try
    // 此处编写对JSONArray的业务处理逻辑
  finally
    JSONArray.Free;
  end;
end;

注意事项

  • TJSONObject.ParseJSONValue系列方法返回的JSON对象生命周期由调用方负责,不需要提前创建对应类型的实例来接收返回值
  • 生产环境建议优先使用带类型校验的写法,避免JSON内容非法时触发运行时异常

内容的提问来源于stack exchange,提问作者DeDe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 11:09:01