Newsgroup: it.comp.lang.c++
Titolo: AIUTO (un po' urgente...)

Vorrei cercare di capire un fatto "strano".
Ho scritto un'applicazione (uso VC++ 5 con MFC)
basata sull'architettura document/view.
All'interno della mia classe derivata da CDocument
ho inserito due ogetti appartenenti a classi da me
create, l'una derivata dall'altra.
Nella classe base (CStlModel) esistono una lista
concatenata (ovvero un ogetto di classe CList) ed
un puntatore al primo elemento di una struttura ad
albero (il puntatore in questione è in effetti
contenuto in un'altra classe, chiamata CTree, che
incapsula anche alcune funzioni per la gestione
dell'albero).
Nella classe derivata (CStlSlice) sono state
aggiunte altre funzioni per la manipolazione dei
dati nella lista e nell'albero. La lista e
l'albero di questa seconda classe sono riempiti,
durante l'esecuzione, con dati provenienti dalle
strutture della classe base.
Il problema è il seguente: con pochi dati funziona
tutto senza alcun problema, ma non appena cerco di
utilizzare dei dati "reali" (in numero molto
maggiore)accadono cose strane. In particolare
durante il riempimento della struttura ad albero
di CStlSlice (derivata), alcuni elementi vengono
memorizzati in indirizzi di memoria già assegnati
all'albero della classe base (gli elementi di
entrambi gli alberi vengono creati ed allocati con
l'operatore "new").
Faccio un esempio. Se chiamiamo il generico
elemento di un albero "CVertex" l'allocazione
avviene in questo modo:
CVertex* pvert=new CVertex;
ed i dati sono inseriti mediante il puntatore
restituito:
pvert->pincopallino=...
Ora, ho notato che ad un certo punto pvert punta
ad un indirizzo che è già occupato da un  elemento
dell'albero dell'oggetto di classe CModel,
modificandone il contenuto.
Ho pensato che ciò potesse avere a che fare con
visibilità/durata, ma non sono riuscito a venirne
fuori. Il tutto è complicato dal fatto che il
problema non esiste con insiemi di dati limitati,
per cui non mi è possibile eseguire tests
semplici.
Quacuno ha qualche idea?
La memoria allocata con new non dovrebbe essere
riservata a prescindere da problemi di
visibilità/durata?
Vi ringrazio moltissimo in anticipo !
Ciao
Michele
Sent via Deja.com 
http://www.deja.com/
Share what you know. Learn what you don't.

semplici.
Non e' mai facile trovare la soluzione a problemi di questo tipo. Possi dirti che *certamente* allocando la memoria con "new" e' impossible che succeda quello che descrivi. Per cui il problema sta da un'altra parte...
Dovresti controllare tutto il codice che manipola gli oggetti "CVertex" e vedere se non c'e' qualcosa di strano, ad es. eventuali spostamenti dovuti ad eliminazioni dalla lista, bilanciamento dell'albero o cose di questo genere. Magari l'hai gia' fatto, ma ti dico cosa faccio io di solito: seguo attentamente con il debug tutto il codice istruzione per istruzione cercando di ricreare con dei casi di prova tutte le possibilita'.
Dici che il problema si verifica quando ci sono molti elementi; magari ci sono dei limiti nell'uso delle liste o dell'albero? Oppure ci sono degli errori non controllati, magari le stesse operazioni di allocazione?
Scusa se non ti ho dato l'aiuto che magari ti aspettavi... :-)
Ciao,
Angelo Donatiello.


Avevi ragione, la colpa era di un'istruzione subdola la quale cambiava
l'indirizzo di un elemento senza alterarne il contenuto. In pratica
invece di leggere un elemento N dall'albero A e di inserirne una copia
nell'albero B, lasciando quindi il primo albero inalterato, cambiava i
puntatori ai figli del nodo di A associandoli alla posizione della copia
di N nell'albero B. Dal momento che i dati contenuti nei nodi erano gli
stessi non era visibile alcun errore. Il problema nasceva in fase di
cancellazione dell'albero B: i nodi di A (albero base) i cui puntatori
erano "tarocchi" si ritrovavano senza più nulla a cui puntare, generando
gli errori più disparati.
Ora funziona!!
Ciao e grazie
