Newsgroup: it.comp.programmare.win32
Titolo: MemoryLeak con CArray ?

Salve a tutti ho un problema di memoryleak in una applicazione.
Sara' la tarda ora ,ma da un programma di test sto vedendo che 
con un CArray globale di elementi ClasseX (con qualche intero ) se
faccio una serie di Add diciamo di 10000 elementi il programma prende
la giusta memoria.
quando chiamo la RemoveAll() pero' non libera assolutamente nulla.
Nulla cambia se chiamo anche la FreeExtra().
Sto prendendo lucciole per lanterne ?
Avete qualche consiglio da darmi?
Grazie in anticipo 
It

 Nulla cambia se chiamo anche la FreeExtra().
E' normale, perchè nel tuo caso gli oggetti rimossi non vengono distrutti.
Perchè vengano distrutti, devi provvedere all'override di una helper 
function DestructElements per il tuo tipo.
Vedi quà: 
http://tinyurl.com/4quyk


ciao grazie dell'info , pero' l'implementazione di default per una
classe statica richiama il distruttore , che in effetti gira .
[The default implementation of DestructElements calls the destructor
for each element..]
in particolare ecco il codice ulteriormente semplificato che presenta
il problema.
Sicuramente mi sfugge qualcosa , ma non vedo cosa!
Grazie ancora
It
[codice cpp]
typedef struct _TT
{
	int tempo;
	char msg[2];
} TT;
CArray <TT, TT&>  lista;
for (int i=0;i<1000;i++){
	w.tempo=i;
	lista.Add(w);
}
lista.RemoveAll();
lista.FreeExtra();	//in questo caso non servirebbe ma ..
[/codice cpp]

 } TT;
Non e' che il problema e' in quel "char msg[2]", nel senso che magari 
usi stringhe piu' grandi di *1* carattere (dato che il secondo e' 
riservato a '\0', per lo meno per stringhe standard C) ?
Potresti provare - se la cosa puo' aver senso per la tua struttura TT - 
ad usare:
<CODE>
class TT {
public:
  int tempo;
  CString msg; // o std::string msg
};
</CODE>
Ciao,
Dan

Dan
Ciao 
e grazie
It

 che un ML sembra un baco (di window ?)
...Mah, per esperienza direi che "bachi" di questo tipo per Windows o 
MFC sono molto rari... Io guarderei con piu' attenzione il codice.
Purtroppo pero' dal codice che hai postato non si puo' dedurre 
granche'...
Ciao,
Dan


Ciao scrivo solo per dire che il problema si presenta anche con VC6
SP5 W2K
:-((
It

 :-((
Guarda, siccome mi avevi messo questa pulce nell'orecchio, ho provato a 
simulare la cosa, realizzando una banale classe con due CString dentro e 
poi creando un CArray global di tale classe, e aggiungendo e svuotando i 
vari elementi dell'array via pressione di bottoni GUI, non ho avuto 
nessun problema: tutto liscio come l'olio, nessun memory leak.
Secondo me il tuo problema e' da qualche altra parte nel codice, ma non 
in CArray...
Dan

 in CArray...
Non mi sento neanche di consgliarti di usare degli smart-pointer, dato 
che mi pare di capire che la tua classe non ha dati membro puntatori, e 
che il tuo array e' un array che contiene le istanze della classe, e 
*non* *puntatori* ad esse,
cioe': 
CArray< MiaClasse > 
// e non CArray< MiaClasse * >
...spero tu riesca a risolvere la cosa.
Ciao,
Dan

Dan
Ciao , come scritto a me si evidenzia cio' stressandolo un po'  e
impostando setsize(0,1) all'inizio.
Se hai voglia posso postarti il codice per email , cosi' potrai
verificare tu stesso.. (se si' , la tualmail e' valida?)
Altrimenti mi invii il tuo che lo provo io?
Ciao
It

 verificare tu stesso.. (se si' , la tualmail e' valida?)
La mia e-mail su hotmail e' valida, si'. Posta pure, sono curioso...
Ciao,
Dan

 verificare tu stesso.. 
Ho provato e non ho problemi di memory-leak...
Ho giusto scritto class TT al posto di typedef struct _TT ... pero' non 
credo che il problema sia li'.
Semmai, e' un po' lento quando aggiungi gli elementi a causa del tuo - 
per me incomprensibili - SetSize con un grow-by di 1 (!!), estremamente 
inefficiente, dato che il punto debole degli array e' proprio la 
crescita, e tu con un grow-by di 1 esageri la cosa!
Pero' non ci sono memory-leak... (il debugger non segnala niente).
Ripeto, e' solo lento inserire 10.000 elementi class in CArray con un 
grow-by di 1 :)
Ciao,
Dan

Dan
Hai provato a vedere ma memoria impiegata anche con il
PerformanceMonitor?
Su quale S.O. hai fatto la prova?
Ciao
It

 Su quale S.O. hai fatto la prova?
WinXP

WinXP
A parte che , per esperienza , non sempre Il Visual segnala i ML ,  
ripetero' la prova con WinXp , forse si comporta diversamente... mha!
Ciao e grazie ancora
It

 Ciao e grazie ancora
Ciao e di nulla.
Dan

Dan
Almeno del disturbo no? :-)
Ciao
It