Memory leak?
ejbenjaro válaszolt a témára: Memory leak?
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: http://lassuviz.blogspot.hu/
- Gábor
-
- Adminisztrátor
-
- Hozzászólások: 436
- Karma: 8
- Köszönetek: 70
Gábor válaszolt a témára: Memory leak?
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...

Í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
- Gábor
-
- Adminisztrátor
-
- Hozzászólások: 436
- Karma: 8
- Köszönetek: 70
Gábor válaszolt a témára: Memory leak?
Teszt 1:
doc.free;
els.free;
Test 2:
els.free;
doc.free;
Teszt 3:
var
ss: tstringstream;
....
begin
....
ss:=tstringstream.create(Site);
readhtmlfile(doc,ss);
.......
ss.free;
els.free;
doc.free;
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.
ejbenjaro létrehozta a témát: Memory leak?
Sziasztok!
Van egy ilyen kódom: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:
Valami ötlet, hogy minden memóriablokk felszabadításra kerüljön?
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.
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: http://lassuviz.blogspot.hu/