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
相关产品推荐
相关产品推荐

