delphi 內存泄漏檢測


FormCreate 加一條 或者在project里加上,就是fastmm
ReportMemoryLeaksOnShutdown:=true;

 

  Application.Initialize;
  Application.MainFormOnTaskbar := True;

ReportMemoryLeaksOnShutdown:=true;

 

退出程序的時候,如果有內存泄漏,會彈出一個對話框.

*1就是有1個,3就是有3個,2就是有2個

13 - 20 bytes: TJSONNumber x 1, TJSONObject x 1, TJSONString x 3, TJSONPair x 2, UnicodeString x 2
21 - 28 bytes: UnicodeString x 1, Unknown x 1
29 - 36 bytes: UnicodeString x 1
37 - 44 bytes: TList<System.JSON.TJSONPair> x 1

 一、JO 要釋放

jo := TJSONObject.ParseJSONValue('{"name": "John Smith", "age": 33}') as TJSONObject;

這個用完jo.free,否則就有內存泄漏 或者 freeandnil(jo);

如果jo多次使用,下面2種方法都可以,釋放沒問題。

//if jo<>nil then  freeandnil(jo);
if jo<>nil then  jo.Free;

二、Serialize 有泄漏

self.injson := system.JSON.Serializers.TJsonSerializer.Create.Serialize<TPerson>(inp);

改為

var tt :=  system.JSON.Serializers.TJsonSerializer.Create;
self.injson:= Serializer.Serialize<TPerson>(inp);
tt.Free;

 

TJsonSerializer.Create.Deserialize也有泄漏換成 create free就好了

三、TJSONArray  無泄漏

var jr:tjsonarray;

jr := jo.GetValue<TJSONArray>('data.dataList') ;

      for i := 0 to jr.Count - 1 do
  begin
    jrow := jr.Get(i) as TJSONObject;
  self.Caption:=  jrow.GetValue<string>('ampm');

end;

 

封裝后調用簡單,無內存泄漏

  TKPJSON=class
    class function  Deserialize<T>(const AJson: string): T;
    class function  Serialize<T>(const AValue: T): string;
  end;

  class function TKPJSON.Deserialize<T>(const AJson: string): T;
begin
  var tt :=  system.JSON.Serializers.TJsonSerializer.Create;
  result:= tt.Deserialize<T>(ajson);
  tt.Free;
end;

class function TKPJSON.Serialize<T>(const AValue: T): string;
begin
var tt :=  system.JSON.Serializers.TJsonSerializer.Create;
result:= tt.Serialize<T>(AValue);
tt.Free;
end;

 

self.injson:=  TKPJSON.Serialize<T100110>(inp);//簡單到一行代碼
var top :=  TKPJSON.Deserialize<T100110>(self.injson);//簡單到一行代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM