已添加到其他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
相关产品推荐
相关产品推荐

