PDA

View Full Version : [C# 3.5] List e memory leak


Kaldais
23-04-2009, 17:36
Bondì!

Ho un piccolo dubbio che mi assale :fagiano:, praticamente utilizzo LINQ per popolarmi una lista di classe X


private List<X> result;
result = LINQ.X.ToList<X>();


Dato che il risultato è parecchio pesante mi vedo aumentare la memoria occupata di ca. 20 mb, e vabbè fin qui tutto bene.

Il problema è questo: quando chiudo il form la lista continua a perseguitarmi :asd:.

Ho notato con un profiler che non viene assolutamente mangiata dal GC, nè forzando il Dispose() del form, nè mettendo il riferimento a null alla lista. I 20 mb sono lì, ed ovviamente continuano ad aumentare se chiudo e riapro il form ad infinito, fino ad arrivare alla saturazione del PC.

Mi sfugge qualcosa? Cosa può essere?

Kaldais
23-04-2009, 18:02
Errata corrige: stiamo parlando di memoria allocata e non di quella effettivamente usata dal programma. :wtf:

gugoXX
23-04-2009, 18:14
posta qualcosa in piu'... cos'e' la classe X?

Poi la parte
result = LINQ.X.ToList<X>();
non mi sembra corretta. (la prima X dovrebbe essere una collezione, ma e' gia' il nome della classe. Insomma non mi e' ben chiara la situazione)

Kaldais
23-04-2009, 18:27
Sì, la sintassi effettivamente non è corretta, ma più che un problema di LINQ è un problema di memoria allocata. La classe X è una semplice classe LINQ, 'na tabella semplice con qualche stringa ed intero.

!k-0t1c!
26-04-2009, 11:51
Ecco qualcosa che puoi fare, tralasciando la sintassi che dovrebbe essere:

private List<X> result;
result = QUALCHE_OGGETTO.ToList(); //il tipo deve venire inferito automaticamente!


Assicurati di chiamare Dispose sul form, non è un optional
Assicurati di non passare quella lista a qualche altro oggetto che può sopravvivere al form, altrimenti sia la lista stessa sia tutto il contenuto resteranno in memoria
Prova a forzare il GC a sbarazzarsi degli oggetti inutilizzati

Se nessuna di queste cose basta, il problema è chiaramente qualcosa legato al punto 2 che non riesci a individuare, quindi servirà che posti più codice...