Lazarus 3.2 (2024.02.28.)
Letöltés

  • Oldal:
  • 1

TÉMA:

Memory leak? 2017 júl. 23 20:40 #2230

  • ejbenjaro
  • ejbenjaro profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 66
  • Köszönetek: 4
Köszönöm szépen.
Mottó:
"Az ember sokszor más mint aminek látszik. De ritkán jobb..."
--
Gép : Asus P5G41T-M LX, Intel Celeron DC E3400, 4GB DDR3, 320GB SATA2, minden más integrált.
OS : Ubuntu 14.04
--
web: lassuviz.blogspot.hu/

Memory leak? 2017 júl. 23 12:11 #2228

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 506
  • Köszönetek: 86
Nem tudtam nyugodni :)

Íme a megoldás: a ReadHTMLFile eljárás mindig új THTMLDocument példányt hoz létre, ezért annak előzetes létrehozására nincs szükség. Továbbá a TStringStream paraméterben történő létrehozása miatt is elszivárgott 2 blokk...
program kvtmoziparser;
 
{$mode objfpc}{$H+}
 
uses heaptrc, classes, sysutils, fphttpclient,sax_html, dom_html, dom;
 
var
  doc: thtmldocument;
  els: tdomnodelist;
  ss:tstringstream;
  Site: String;
  i: LongInt;
 
begin
  //doc:=THTMLDocument.Create;  // Erre itt nincs szükség.
  With TFPHttpClient.Create(Nil) do
    try
      Site:=Get('http://konyvtarmozi.hu/vetitesek.aspx');
    finally
      Free;
    end;
 
 
  Delete(Site,1,pos('Soron k',Site));
  Delete(Site, pos('<td colspan="2" class="focim">Elm',Site),Length(Site));
 
  ss:=tstringstream.create(Site); // Így kell létrehozni, hogy később teljesen felszabadítható legyen a foglalt memória.
 
  readhtmlfile(doc,ss); // A ReadHTMLFile mindig új THTMLDocument példányt hoz létre.
 
  els := doc.GetElementsByTagName('td');
 
  if els.Count > 0 then begin
    for i:=0 to els.Count-1 do
      writeln(tdomelement(els[i]).textcontent);
  end;
 
  ss.free; // Fel kell szabadítani
  els.free;
  doc.free;
end.

Heap dump by heaptrc unit
34433 memory blocks allocated : 1085020542/1085113984
34433 memory blocks freed : 1085020542/1085113984
0 unfreed memory blocks : 0
True heap size : 196608
True free heap : 196608

Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

Memory leak? 2017 júl. 23 11:27 #2227

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 506
  • Köszönetek: 86
Szerintem ez megér egy hibajelentés t... vagy mégsem... (szerk.)

Teszt 1:
doc.free;
els.free;
"Acces violation" és "58 unfreed memory blocks" (ami a kivétel miatt nem is csoda)

Test 2:
els.free;
doc.free;
"12 unfreed memory blocks" (nincs változás)

Teszt 3:
var
	ss: tstringstream;
	....
begin
	....
	ss:=tstringstream.create(Site);
	readhtmlfile(doc,ss);
	.......
	ss.free;
	els.free;
	doc.free;
"10 unfreed memory blocks"

Megpróbáltam a .CleanupInstance metódus használatával is erőszakoskodni, de az eredmény ugyanez lett.

Tudom, hogy nem vigasz, de a szoftver leállásakor (annak belső eljárásai által) fel nem szabadított memóriát a rendszer általában visszanyeri.
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

Memory leak? 2017 júl. 19 14:29 #2226

  • ejbenjaro
  • ejbenjaro profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 66
  • Köszönetek: 4
Sziasztok!

Van egy ilyen kódom:
program kvtmoziparser;
 
{$mode objfpc}{$H+}
 
uses classes, sysutils, fphttpclient,sax_html, dom_html, dom;
 
var
  doc: thtmldocument;
  els: tdomnodelist;
  Site: String;
  i: LongInt;
 
begin
  doc:=THTMLDocument.Create;
  With TFPHttpClient.Create(Nil) do
    try
      Site:=Get('http://konyvtarmozi.hu/vetitesek.aspx');
    finally
      Free;
    end;
  Delete(Site,1,pos('Soron k',Site));
  Delete(Site, pos('<td colspan="2" class="focim">Elm',Site),Length(Site));
 
  readhtmlfile(doc,tstringstream.create(Site));
  els := doc.GetElementsByTagName('td');
 
  if els.Count > 0 then begin
    for i:=0 to els.Count-1 do
      writeln(tdomelement(els[i]).textcontent);
  end;
  doc.free;
end. 
Fordítás és futtatás után NEM szabadítja fel az összes lefoglalt memóriát a futás végén, marad 12 felszabadítatlan memória blokk. Gyanúm szerint az els változóban levő adatok okozhatnak problémát.
A HeapTRC az alábbi kimenetet adja:
Heap dump by heaptrc unit
36727 memory blocks allocated : 539872025/540092656
36715 memory blocks freed     : 539851498/540072112
12 unfreed memory blocks : 20527
True heap size : 1867776
True free heap : 1845280
Should be : 1845696
Call trace for block $00007FEDE38D0C90 size 17697
  $00000000004743B1
  $0000000000475CE9
  $0000000000476426
  $00000000004766A5
Call trace for block $00007FEDE391A040 size 24
  $0000000000474A29
  $0000000000475CE9
  $0000000000476426
  $00000000004766A5
Call trace for block $00007FEDE38C03C0 size 84
Call trace for block $00007FEDE3919800 size 32
Call trace for block $00007FEDE38C02C0 size 98
Call trace for block $00007FEDE3919680 size 32
Call trace for block $00007FEDE38C01C0 size 96
Call trace for block $00007FEDE3919440 size 40
  $0000000000482F36
Call trace for block $00007FEDE38D03F0 size 2048
Call trace for block $00007FEDE39189C0 size 32
Call trace for block $00007FEDE38C81E0 size 128
Call trace for block $00007FEDE38B00C0 size 216

Valami ötlet, hogy minden memóriablokk felszabadításra kerüljön?
Mottó:
"Az ember sokszor más mint aminek látszik. De ritkán jobb..."
--
Gép : Asus P5G41T-M LX, Intel Celeron DC E3400, 4GB DDR3, 320GB SATA2, minden más integrált.
OS : Ubuntu 14.04
--
web: lassuviz.blogspot.hu/

  • Oldal:
  • 1