|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6328
|
Problema con array dinamici
Mi capita una cosa strana. Nel mio programma dichiaro un array dinamico di interi:
int*nodiaperti; All'interno di una funzione dichiaro : nodiaperti= new int[1000]; Alla fine della funzione dealloco il tutto : delete[] nodiaperti; Quando richiamo la seconda volta la funzione, senza uscire dal programma, l'array viene ricreato ma non è vuoto. Alcune posizioni risultano occupate da numeri interi molto grossi. Ma perchè? Se dealloco l'array e lo rialloco, dovrebbe essere vuoto o sbaglio? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Non vorrei dire una cavolata ma la new non "pulisce" la zona di memoria allocata quindi ti restituisce un indirizzo di memoria valido che può essere pieno di robaccia. Sta a te ripulirla prima di cominciare ad usarla.
ciao |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6328
|
Quote:
Dichiarando int*nodiaperti = new int[1000] e magari uso solo 500 posti, gli altri 500 li risparmierei. Invece, se sono costretto ad azzzerare tutti e 1000 gli elementi, è come avere un array statico di 1000 elementi. |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
|
Quote:
DISCLAIMER: non tocco C++ da troppo tempo ormai, ti conviene attendere qualche risposta più 'autorevole'.
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer °SetiEmperor°| Ninja Technologies { qualunque cosa sia, è veloce e fa male (cit.) } |
|
|
|
|
|
|
#5 | ||
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
Quote:
ciao |
||
|
|
|
|
|
#6 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6328
|
Quote:
int*a= new int[10] a punta al primo indirizzo dell'array dinamico di interi. Io non so a priori quanti elementi avrà questo array. Tale array cresce man mano che il programma avanza e ce li aggiunge. Io vorrei che al massimo mi occupasse 1000 posti,senza allocarli subito, quindi se alla fine ne ha utilizzati 500, gli altri 500 non li deve aver allocati. Non so se questo vuol dire memoria dinamica. Ultima modifica di Unrue : 21-04-2006 alle 22:41. |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6328
|
Quote:
|
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6328
|
Quote:
|
|
|
|
|
|
|
#10 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() non avevo considerato la Borland be' comunque la stessa cosa in determinati casi capita anche col VC++ ciao |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6328
|
Quote:
se alloco dinamicamente un'array di interi? Perchè sopra mi hanno detto che cosi' l'allocazione è statica. Ma allora a cosa serve l'operatore new quando do' una dimensione fissa all'array? New serve solo quando la dimensione non è specificata subito ma durante l'esecuzione? Del tipo : int*a= new int[dim] e dim gli e la do' successivamente in fase di esecuzione, per esempio come input da tastiera. |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Quote:
Se vuoi fare tutto in un colpo, in questo modo inizializzi tutto a zero: Codice:
nodiaperti = new int[1000](); Codice:
delete[] nodiaperti; nodiaperti = 0;
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6328
|
Quote:
Quindi scrivere int*nodiaperti = new int[1000], equivale a scrivere int a[1000]; int*nodiaperti= &a; ? Quindi è come fare l'allocazione statica se ho ben capito. Pero' io volevo che mi allocasse un elemento per volta , man mano che lo inserivo. Non tutti in un colpo. Per esempio, io credo che i vector facciano cosi, perchè si puo' dichiarare senza specificare le dimensioni, e poi inserire gli elementi con la pushback. In tal modo, alloca un elemento per volta, suppongo. |
|
|
|
|
|
|
#14 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
Codice:
int *a = new int[1000]; int *b = new int[dim]; Codice:
int a[1000]; Codice:
int b[dim]; |
|
|
|
|
|
|
#15 | ||
|
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Quote:
Codice:
int a[10]; int *b = a; // dove 'a' equivale a &a[0] Quote:
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
||
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6328
|
Quote:
int *a = new int[1000]; cosa c'e' di dinamico? La dimensione dell'array è fissata a priori. |
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
|
Nessuno ha ancora precisato una cosa, di cui non sono più tanto sicuro:
Codice:
int a[1000]; // alloca un array di 1000 interi nello stack int* b = new int[1000]; // alloca un array di 1000 interi nello heap
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer °SetiEmperor°| Ninja Technologies { qualunque cosa sia, è veloce e fa male (cit.) } |
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6328
|
Quote:
int* b = new int[1000] . Io per dinamico intendo che l'allocazione la posso fare durante l'esecuzione. Se mi alloca subito 1000 interi non vedo cosa cambi dal punto di vista dell'occupazione di memoria, a parte che una scrive nello stack e l'altra nell'heap. |
|
|
|
|
|
|
#19 |
|
Member
Iscritto dal: Apr 2006
Messaggi: 89
|
Risposta al problema
Prima di risponderti premetto che non ho ancora letto le altre risposte che ti hanno dato...quindi è probabile che hai già risolto il problema. Cmq...
Quello che accade è questo: Con l'operatore delete non cancelli il contenuto della memoria; ciò che fa l'operatore delete è la seguente cosa: restituisce al sistema la memoria precentemente occupata dalla variabile (la dealloca); ciò vuol dire che in qualche modo è come se si avvertisse il programma che lo spazio precedentemente occupato non serve + e quindi può essere nuovamente usato e sovrascritto. Fai attenzione a quello che ho detto: SOVRASCRITTO!!! questo significa che è possibile addirittura recuperare le informazioni contenute in una variabile (o array) precedentemente deallocate che non sono state ancora sovrascritte. Probabilmente i "numeri interi molto grossi" che vedi sono informazioni contenute in quell'area di memoria che non servono +. Prima di concludere vorrei dirti un'altra cosa: per l'allocazione dinamica della memoria (e in particolare per creare array dinamici) esistono le STL (Standard template Library) che sono MOOOOLTO efficienti e facili da usare. come disse il mio prof. di programmazione: "è inutile inventarsi ogni volta la ruota". Spero che questo messaggio ti è stato d'aiuto! |
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6328
|
Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:18.



















