Newsgroup: it.comp.lang.c++
Titolo: AIUTO: operatori new e delete e problemi inspiegabili !!!

Ciao ragazzi,
vi sottopongo un problema che negli ultimi tempi ha messo a dura prova la
mia stabilità mentale (nel senso che sto letteralmente impazzendo). Sono
riuscito a isolare il problema, ma
NON NE CONOSCO LE CAUSE :-((( !
Sto costruendo un sistema di archiviazione dei dati che fa uso di campi,
record ecc. ecc., e la classe Field (campo) ha una funzione resize(int) che
ridimensiona il buffer dove sono memorizzati i dati.
Date un po' un'occhiata:
Field* Field::resize(int sz)
{  char temp[sz];
   if(size>0)
   { strncpy(temp,data,sz);
     delete[] data;
   }
   data=new char[sz+1];
   if(size>0) { strcpy(data,temp); data[sz]='\0'; }
   size=sz;
   return this;
}
Questa funzione, studiata per molto tempo, non avrebbe dovuto dare problemi,
ma dopo un paio di ridimensionamenti del campo Linux andava in segmentation
fault. Allora, per verificare la dimensione di ridimensionamento, ho
inserito all'inizio della funzione la riga
cout<<sz;
e voilà!!!! come per incanto, il programma va benissimo. Ho provato anche a
metterlo in crisi con righe del genere:
Field *campo = new field("21345176....",'s'); //costruzione;
campo->resize(121)->resize(3)->resize(200)->resize(6);
Ma niente, con l'istruzione cout all'inizio il prog. non vuol saperne di
crashare.
Per di più ho fatto un'altra prova sotto DOS con DJGPP, e il
problema sembra non esserci.
Ora mi chiedo: DOOOVE SBAGLIO ???????????????????
Perché ho bisogno di visualizzare il valore di sz (nota: ogni altra
operazione su tale variabile è inutile: solo cout<<sz sblocca il prog.) per
far funzionare maledettamente bene questo dannato programma?
Grazie a tutti per l'aiuto (I'm going crazy, help me!!!)
Domenico Barra

 e voilà!!!! come per incanto, il programma va benissimo.
Non potrebbe essere un bug del compilatore?
EMG

}
P.S. anziche utilizzare new e delete in questa maniera, forse e' meglio
utilizzare malloc/free/realloc ( soprattutto l'ultima ti avrebbe fatto
risparmiare un sacco di codice ! ).
Oppure anche usare vector[]; per string non so che dirti: fino a che punto
ti consente di controllare la dimensione del buffer ( e fino a che punto ti
serve controllarla ? )

 Ora mi chiedo: DOOOVE SBAGLIO ???????????????????
Ad usare cosi' tanti punti interrogativi!
Scherzi a parte, sbagli a non usare <vector>. Se la risposta non ti
soddisfa, sbagli perche' da qualche parte hai assegnato a data memoria
non allocata; o hai gia' cancellato data; o hai allocato data con new
invece che con new[]; o hai sovrascritto la memoria allocata per
data....
Usando <vector> elimini molte delle possibili cause di errore.

 Assolutamente passa a usare vector<char> invece di char[]!
O std::string ...
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Univ. of Padova, Dept. of Physics - Padova, Italy            
lor...@pd.infn.it

>Non potrebbe essere un bug del compilatore?
Beh, ho risolto: pongo in ogni caso il terminatore '\0' alla fine dell'array
di caratteri e... il programma funziona bene
Grazie a tutti!!!
Domenico

risparmiare un sacco di codice ! ).
Non sono d'accordo, in C++ e` sempre preferibile usare new/delete
che sono assai piu` sicure, anche in relazione al meccanismo delle
eccezioni ed alla possibilita` di adattarne (entro certi limiti) il
comportamento.
La cosa migliore in assoluto e` comunque fruire di classi come
std::vector<> e std::string.
Paolo
-------------------------------------------
  Paolo Marotta
 
http://web.tiscalinet.it/paolo_marotta/
-------------------------------------------

std::vector<> e std::string.
me ne sto accorgendo !!!

realloc ...
Te la riscrivi in 2 minuti e rimedi pure ai problemi di malloc & C.


Te la riscrivi in 2 minuti e rimedi pure ai problemi di malloc & C.
sicuro che riesci a riscrivere una realloc in C++ ... su cosa ti basi ?