Newsgroup: it.comp.lang.c++
Titolo: Strano errore con i puntatori...

Ho una procedura in cui all'inizio ci sono delle dichiarazioni del tipo
unsigned char * S0 = new (unsigned char [num])
...
unsigned char * S3 = new (unsigned char [num])
poi seguono una serie di cose, e poi c'e' la chiamata ad un'altra 
procedura che scrive sul vettore puntato da S0.
Inizia a questo punto un ciclo in cui con procedure analoghe vado a 
scrivere anche sulle altre Si, alla fine di ogni iterazione del ciclo
c'e' un'assegnazione del tipo S0=S3. 
A questo punto cosa succede, io lancio il programma la procedura viene
richiamata viene eseguito tutto il ciclo e tutto funziona correttamente,
poi senza uscire dal programma ho la possibilita' di richiamare 
nuovamente la procedura suddetta. Quindi dovrebbe ripartire il ciclo e 
cosi' via, in realta' il programma termina (con un SegFault, uso Linux)
prima di completare la prima iterazione. Mi sono accorto che pero' se 
elimino l'assegnazione di cui sopra (S0=S3) tutto funziona
correttamente.
Tutto questo mi lascia un po' perplesso perche' il programma termina con 
una chiamata ad una procedura che con i puntatori Si non ha nulla a che
fare.
Mi sapete dare una mano? Grazie.
-- 
  _  _  >>Now at work<<  _     || ICQ number.................Non lo uso
 | \| |___ _____ ___ ___|_|___ || Home-Page ................Non ce l'ho
 | .` | -_|     | -_|_ -| |_ -||| E-Mail................Non l'avrai mai
 |_|\_|___|_|_|_|___|___|_|___||| Un Nemesis che ha pochi e-contatti ;)

 c'e' un'assegnazione del tipo S0=S3.
e dopo questa assegnazione magari fai
delete [] S0; // qui S0 punta a S3
delete [] S3; // qui cancelli S3 che hai gia` cancellato
non buttare via il valore restituito da new prima di chiamare
la relativa delete. Magari e` un altro problema...
ciao
Massimo

delete [] S3; // qui cancelli S3 che hai gia` cancellato
No, i delete sono tutti alla fine della procedura, cioč č l'ultima cosa
che faccio prima di tornare al main.
In effetti perň penso che quelle assegnazioni siano abbastanza scorrette,
nel senso che ad esempio non posso piů deallocare l'area di memoria
puntata inizialmente da S0 in quanto nell'assegnazione la perdo. Forse
dovrei usare dei bei memcpy.
Un Nemesis un pň confuso.
-- 
  _  _ >>Now on Linux<<  _     || ICQ number.................Non lo uso


 Forse dovrei usare dei bei memcpy.
C'č qualche buona ragione per non usare std::vector<char>?
Max

 dovrei usare dei bei memcpy.
basta usare un puntatore di servizio che di volta in volta assegni
a cio` che ti serve, senza necessita` di modificare i valori restituiti
da new. Peraltro concordo con Max nel suggerirti di usare i
vector<unsigned char> in questo modo risolvi automaticamente molti problemi
legati all'allocazione dinamica della memoria.
ciao
Massimo

C'è qualche buona ragione per non usare std::vector<char>?
Si, ho preso in eredità parti di codice non scritte da me, e quindi
per cambiare il tutto ci metterei millenni :(


 per cambiare il tutto ci metterei millenni :(
Allora usare degli smart pointer ?
Ciao
Gaetano
-- 
Posted from 
nts-03.mm.eutelsat.org
 [194.214.173.15] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Allora usare degli smart pointer ?
Non so cosa siano, mi puoi dare qualche input?


 Non so cosa siano, mi puoi dare qualche input?
ci sono vari tipi di smart pointer. Uno di essi, quello con l'ownership 
esclusiva, e' supportato direttamente dalla libreria standard 
attraverso il template auto_ptr<>. Inoltre, su 
cpp.programmazione.it
, 
trovi un interessante articolo che riguarda la progettazione e l'uso di 
uno smart pointer con ownership condivisa (solo che ora non ricordo il 
titolo esatto; cmq l'autore e' "Fulvio Esposito").
ciao Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it