xml parser memory leak ?

Fórumok

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

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

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

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