Arsip: SetLength,memory leak

 
user image
more 15 years ago

jordan

Hi, misal g punya array of record, kyk gini :

type
  TDetail = record
    A:String;
    B:String;
  end; 
  TMyData = record
    Kode:String;
    Nama:String;
    Harga:Currency;
    Detail:Array [1..12] of TDetail 
  end;
var MyData : Array of TMyData;
procedure satu;
begin
   SetLength(MyData,700000);
   .......
   .......
   .......
end;
di procedure lain g panggil SetLength(MyData,0). g pikir SetLength(0) bakal me-release memory yg sdh terpakai, tp setelah g coba jalanin programnya sebanyak 3x (tanpa tutup & buka aplikasi baru), muncul error Out of memory. Waktu jalanin program, g lihat memory usage di taskmanager, saat SetLength(0) dipanggil, memory usage di taskmanager bener2 turun, tp ternyata tetep muncul error out of memory, bahkan komputer g jadi lama jalannya. Sudah coba google tentang memory leak, dpt 1 artikel, menurut artikel nya: "Try to minimze and restore the application. I'm not joking, it has to do with the updating of counters in NT performance. Freed memory still counts as allocated in Task manager unless you minimize the application." jadi di procedure yg manggil SetLength(0) g buat kyk gini:

procedure dua;
begin
  SetLength(MyData,0);
  Application.Minimize;
  Sleep(5000);
  Application.Restore;
end;
g coba gak berhasil, masih keluar error out of memory, hanya klo di-minimize, memang memory usage di taskmanager jd jauh berkurang lg. Ada yg punya saran gimana perbaikin error nya? thx
user image
more 15 years ago

mat_koder

reply corrected & deleted.
user image
more 15 years ago

mat_koder

ooops........ kode berikut ( di D7 pake MM bawaan Delphi) ngga ada errornya walaupun dilaunch 10 kali ( ada 10 aplikasi yg sama dijalankan dan masing-masing aplikasi memakai memory sekitar 78Meg waktu setlength 700000 dan jadi 2 Meg setelah di setlength= 0). Tentunya masing masing dijalankan setelah aplikasi sebelumnya selesai menjalankan proses de-allokasi.

type
  TDetail = record
    A:String;
    B:String;
  end;
  TMyData = record
    Kode:String;
    Nama:String;
    Harga:Currency;
    Detail:Array  of TDetail
  end;
var MyData : Array of TMyData;
var
  Form1             : TForm1;
implementation
{$R *.dfm}
procedure satu;
begin
   SetLength(MyData,700000); // alokasi 
   SetLength(MyData,0); //de-allokasi
end;
initialization
  satu;
kesimpulan: di statement SetLength(MyData,0) , string-string yg ada semuanya juga langsung di-freed tanpa menunggu aplikasi terminate. kayanya ada yg ngga lengkap dalam penuturan masalah anda.
user image
more 15 years ago

DelphiExpert


  SetLength(MyData, 700000); // get mem
  ...
  MyData:= nil; // free mem
  ...
  SetLength(MyData, SomeSize); // get mem, re-use
  ...
  MyData:= nil; // free mem
user image
more 15 years ago

cikumiyu

kesimpulan: ... di statement SetLength(MyData,0) , string-string yg ada semuanya juga langsung di-freed tanpa menunggu aplikasi terminate.
Setuju! Seharusnya itu ngga jadi masalah. Letak salahnya bukan masalah alokasi dan dealokasi array. Ada yang lain.
more ...
  • Pages:
  • 1
Share to
Local Business Directory, Search Engine Submission & SEO Tools FreeWebSubmission.com SonicRun.com