Sziasztok !
Az xml parser kódolásával kapcsolatban lenne kérdésem. Nevezetesen:
a $CCCDIR/tools/xmldom/parserinput.cpp forrás file-ban a következő kódrészletet találjuk:
int id;
wchar_t *token;
while( 0!=(id=lexer->getnext(&token)) )
{
xmldom_parser(parser,id,token,lexer);
}
xmldom_parser(parser,0,0,lexer);
xmldom_parserFree(parser,free);
delete lexer;
Deafault kódolás esetén (utf8) a getnext meghívja az utf8_to_wchar() függvényt
( xmldom_lexer.h: *token=utf8_to_wchar(text,textsize,0);)
amely memóriát allokál a transzformált ucs szöveg számára, amelyet a fenti parser ciklus getnext
out paraméterében kapunk vissza. (az utf8_to_wchar() függvény forrása a $CCCDIR/ccclib/src/utf8conv.cpp)
A probléma az, hogy nem látom az igy allokált memória felszabaditását. A lemmon parser ugy gondolom
nem szabadítja fel, mert az csak a stack-on lévő dolgokra ügyel.
Lehetséges, hogy ez egy memory leak ?
( egy hasonló parsert irok, igy merült fel ez a probléma)
Köszi: Vad Zoltan
- 4229 megtekintés
Hozzászólások
Futtatok 20 perce egy programot, ami ciklusban ismételget egy XML elemzést. Már lefutott 1 milliószor, de nincs érzékelhető memóriavesztés. (1 byte elvesztése is már 1MB hízást okozott volna.)
A Lemon doksiban szó van a terminális/nemterminális szimbólumok destruktoráról. A terminálisokét a %token_destructor direktívával lehet megadni. Az xmldom_parser.lem 79. sorában ezt látom:
//%token_destructor{if($$) free($$);}
azaz ki van kommentezve. Nem emlékszem már a részletekre, de valószínűleg kísérleteztem a destruktorral, és azért van kikommentezve, mert az a default.
--
CCC3
- A hozzászóláshoz be kell jelentkezni
Csak gyúrtunk még erre Zolival, tegnap mindenféle módon beleberheltünk memory leak-eket ebbe a kódba, és azok szépen leak-eltek is. (Trükkös volt, mert mindketten a free memory-t figyeltük, ami persze a gondos Linux kernelnek köszönhetően gyakorlatilag majdnem konstans volt, aztán a KSysGuard elárulta, hogy az used swap-ot érdemes nézni.) Aztán kiszedtük a leak-et, és olyan volt az used swap, mint Dixie Flatline EEG-je: szálegyenes. Tehát TUTI, hogy a kód nem leak-el, a kérdés csak az, hogy akkor ki a búbánat szabadítja fel azt a nyavalyás tokent? :D
w
- A hozzászóláshoz be kell jelentkezni
Nem az összes szabad memóriát kell nézni, hanem a top-ban a processz által használt virtuális memóriát. A Lemon doksi (külön featureként) írja, hogy az elemző stackjéről lekerülő tokeneket maga az elemző felszabadítja, és ha a default felszabadítás (free()) nem megfelelő, akkor megadhatsz más destruktort. A további részleteket nem ismerem. A Lemon nagyon jó program, imho sokkal jobb, mint a Bison/Yacc. Azért is tértem át rá.
--
CCC3
- A hozzászóláshoz be kell jelentkezni