下面的代码创建内存泄漏。正确的方法是什么?
JSONArray := TJSONArray.Create;
try
JSONArray :=
TJSONObject.ParseJSONValue(
TEncoding.UTF8.GetBytes(
'[{"username":"admin"},{"username":"developer"}]'
), 0
) as TJSONArray;
finally
JSONArray.Free;
end;
问题是对TJSONArray.Create
的调用。你正在创建你自己的TJSONArray
对象,然后覆盖JSONArray
指针指向一个完全不同的TJSONArray
对象,泄漏你Create
'd的原始对象。
所以,简单地摆脱Create
调用,你不需要它。您只需要Free
ParseJSONValue()
返回的对象。
同样,您不需要将JSON字符串转换为字节。ParseJSONValue()
有一个接受string
作为输入的过载。
试试这个:
JSONArray := TJSONObject.ParseJSONValue(
'[{"username":"admin"},{"username":"developer"}]'
) as TJSONArray;
try
// ...
finally
JSONArray.Free;
end;
只是作为提供的有效解决方案的替代方案,但使用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.
请在惊人的文档中找到更多的细节和替代方案。