Newsgroup: it.comp.lang.c++
Titolo: Dubbio atroce sui template list<>

Ciao,
ho questa variabile
list<SectionData> SezLista;
che poi (ovviamente) un pò alla volta si
riempie di strutture SectionData.
Poi, quando è il momento che lo faccia, il
programma termina, ma SezLista non viene vuotata.
Ho introdotto un memory leak? Gli elementi di
una lista template vengono disallocati
automaticamente quando il programma termina o lo
devo fare io a mano?
Nota: ho provato a farlo invocando SezLista.clear()
prima di terminare ma mi dà un errore a runtime :-(

 prima di terminare ma mi dà un errore a runtime :-(
Non dovrebbe: non è che SectionData contiene dei puntatori (ovvero: che 
SecionData non ridefinisca il costruttore di copia e di assegnazione se al 
suo interno effettui delle allocazioni nello heap, usando "new")?
Ciao!
-- 
---
*************** | Have you ever retired a human by mystake?
*** Azathot *** |
*************** | To contact me, ask me gently. Thanks.

 suo interno effettui delle allocazioni nello heap, usando "new")?
No: SectionData è una banale struct che contiene
solo variabili e... ehm... char Nome[8]...
mmmm mi sa che è per quello...

 mmmm mi sa che è per quello...
No, se non allochi esplicitamente non dovrebbe essere li il problema.

Tin Toy wrote:

No, non può essere quello. Puoi postare il pezzo di codice incriminato?


 
Ecco... ho tagliato tutto quello che non c'entra.
Se volete posto il file completo ma è lunghetto...
typedef union {
     IMAGE_THUNK_DATA Thunk;	//struct definita in winnt.h
     char readbuf[sizeof(IMAGE_THUNK_DATA)];
     } DLLThunk;
// ...altre dichiarazioni...
list<DLLThunk> ThunkList;
void PE_EXE::FunzImportate(char *Buf)
{
// ...altre dichiarazioni
DLLThunk DLL_n;
list<DLLThunk>::iterator Tl;
// ...altra roba
     while (DLL_n.Thunk.u1.Function!=0)
         {
         ThunkList.push_back(DLL_n);
         ExeFile.read(DLL_n.readbuf, sizeof(IMAGE_THUNK_DATA));
         };
// ...altri metodi...
PE_EXE::~PE_EXE()      	// distruttore della classe: se
{		       	// provo a decommentare la chiamata
//ThunkList.clear();   	// a clear() mi dà errore a runtime
};			// quando il programma termina...
			// se invece non chiamo clear() funge
			// tutto come un orologio.
Ah dimenticavo: la classe in esame viene creata con il
programma e resta attiva e istanziata finchè il programma
non termina.
Ho provato a definire ThunkList come membro della classe
PE_EXE, come sarebbe stato ovvio, ma ho lo stesso identico
problema... quindi mi sono rassegnato a definirla nel file .cpp
come variabile a sè stante. Tanto viene usata solo qui.
Questa è una di diverse variabili list<qualcosa> che mi
danno lo stesso problema, il post di ieri si riferiva ad
un'altra lista ma la sostanza non cambia, le uso tutte nello
stesso modo e mi danno tutte lo stesso problema.

 stesso modo e mi danno tutte lo stesso problema.
Io uso le "list" da anni... ti assicuro che non è quello il problema. ;-)


          ExeFile.read(DLL_n.readbuf, sizeof(IMAGE_THUNK_DATA));
Domanda: ma "ExeFile" è stato aperto come binario? Cioè, hai fatto da 
qualche parte
        ifstream ExeFile( ...., ios::binary | ios::in );
?
Perché potrebbe essere questo il problema... se fa la traduzione CR+LF->LF o 
viceversa, potrebbe leggere più caratteri di quelli da te indicati... 
sporcando l'heap.
Ciao!


 qualche parte
Sì, infatti è aperto come binario.
Però proprio per questo non dovrebbe tradurre
alcunchè e leggere tutto esattamente come lo
trova. Quanto allo sporcare l'heap... alloco
alcuni array tramite new, che poi distruggo
con delete nel distruttore (ho eliminato quella
parte nel post... che sia lì il problema?)

 parte nel post... che sia lì il problema?)
Ma per cancellare gli array fa
        delete array;
o
        delete[] array;
?
In ogni caso, sei sicuro di non "sbordare" mai con gli elementi degli array, 
scrivendo in zone non pertinenti?


 Ma per cancellare gli array fa
La seconda...
delete []array;