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

已添加到其他TJSONObject的JSONArray或TJSONObject是否需要手动释放?

解答

生命周期规则结论

在Delphi 10.3.3 RIO使用的System.JSON类框架下:

  • 循环中创建的TJSONArray实例不需要你手动释放:调用AddPair将TJSONArray实例传入TJSONObject后,子JSON对象的所有权会自动转移给父对象DocHead,当DocHead被释放时,会自动释放所有通过AddPair添加的子JSON对象,包括你循环创建的所有DocLines实例。
  • 顶层的DocHead(TJSONObject实例)需要你手动释放:因为它没有被挂载到其他上层JSON容器中,没有对象负责它的生命周期,你需要在使用完后主动调用Free,建议用try...finally块包裹DocHead的使用逻辑避免内存泄漏。

你当前代码的潜在问题

你在循环中每次都使用相同的键名DocumentLines调用AddPair,而TJSONObject的键名是唯一的,后续添加的同键名条目会直接覆盖之前的条目,被覆盖的旧TJSONArray实例会被DocHead自动释放,最终DocHead中只会保留最后一次循环生成的数组。如果你的需求是存储所有循环生成的数组,建议先创建一个外层TJSONArray收纳所有行数组,再将外层数组一次性添加到DocHead中,或者为每次的键名添加唯一标识。

特殊场景说明

如果你后续通过RemovePair等方法将某个子JSON对象从父容器中移除,此时该子对象的所有权会交回给你,你需要自行负责它的释放操作。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 16:21:01