Torna indietro   Hardware Upgrade Forum > Software > Programmazione

WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro
Con Midnight, Blizzard tenta il colpaccio: il player housing sbarca finalmente su Azeroth insieme a una Quel'Thalas ricostruita da zero. Tra il dramma della famiglia Ventolesto e il nuovo Prey System, ecco com'è la nuova espansione di World of Warcraft
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Nuova frontiera per i robot tagliaerba, con Ecovacs GOAT O1200 LiDAR Pro che riconosce l'ambiente in maniera perfetta, grazie a due sensori LiDAR, e dopo la falciatura può anche rifinire il bordo con il tagliabordi a filo integrato
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Equilibrio e potenza definiscono il Samsung Galaxy S26+, un flagship che sfida la variante Ultra e la fascia alta del mercato con il primo processore mobile a 2nm. Pur mantenendo l'hardware fotografico precedente, lo smartphone brilla per un display QHD+ da 6,7 pollici d'eccellenza, privo però del trattamento antiriflesso dell'Ultra, e per prestazioni molto elevate. Completano il quadro la ricarica wireless a 20W e, soprattutto, un supporto software settennale
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-04-2006, 14:42   #1
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6851
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?
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2006, 14:56   #2
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
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
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2006, 15:08   #3
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6851
Quote:
Originariamente inviato da VICIUS
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
Pensavo che questo compito lo facesse il delete[] . Pero' scusa, se devo azzerare tutto il vettore per riusarlo, perdo il vantaggio dell'allocazione dinamica.
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.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2006, 15:21   #4
Angus
Senior Member
 
L'Avatar di Angus
 
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
Quote:
Originariamente inviato da Unrue
Pensavo che questo compito lo facesse il delete[] . Pero' scusa, se devo azzerare tutto il vettore per riusarlo, perdo il vantaggio dell'allocazione dinamica.
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.
Forse hai le idee un pò confuse. Per come la dichiari, nodiaperti è una variabile puntatore ad int. A questa variabile assegni l'indirizzo del primo elemento dell'array allocato staticamente (!) tramite l'operatore new. Quest'ultimo ha semplicemente trovato e riservato un'area consecutiva di memoria sufficientemente grande per contenere 1000 interi.

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.) }
Angus è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2006, 15:42   #5
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Quote:
Originariamente inviato da Unrue
Pensavo che questo compito lo facesse il delete[] .
Il compito della delete e dire al sistema operativo che il tuo programma non ha piu bisogno di quella memoria.

Quote:
Originariamente inviato da Unrue
Pero' scusa, se devo azzerare tutto il vettore per riusarlo, perdo il vantaggio dell'allocazione dinamica.
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.
Il vantaggio della allocazione dinamica è che puoi allocare a tempo di esecuzione il numero esatto di elementi che ti servono. Se conosci a priori il numero di elementi che ti servono non ha senso usare l'allocazione dimanica. Se ti servono 372 elementi ne allochi 372, li azzeri per stare sicuro e poi li usi.

ciao
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2006, 17:52   #6
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da Unrue
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?
vuol dire che usi Visual C++; ho indovinato? niente di grave comunque, vai di memset.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2006, 19:44   #7
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6851
Quote:
Originariamente inviato da Angus
Forse hai le idee un pò confuse. Per come la dichiari, nodiaperti è una variabile puntatore ad int. A questa variabile assegni l'indirizzo del primo elemento dell'array allocato staticamente (!) tramite l'operatore new. Quest'ultimo ha semplicemente trovato e riservato un'area consecutiva di memoria sufficientemente grande per contenere 1000 interi.

DISCLAIMER: non tocco C++ da troppo tempo ormai, ti conviene attendere qualche risposta più 'autorevole'.
Scusa se mi permetto ma l'operatore new non serve proprio per allocare dinamicamente qualcosa?. Se scrivo:

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 21:41.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2006, 19:49   #8
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6851
Quote:
Originariamente inviato da 71104
vuol dire che usi Visual C++; ho indovinato? niente di grave comunque, vai di memset.
No, sto usando Borland C++ Builder 6
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2006, 19:50   #9
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6851
Quote:
Originariamente inviato da VICIUS
Il compito della delete e dire al sistema operativo che il tuo programma non ha piu bisogno di quella memoria.


Il vantaggio della allocazione dinamica è che puoi allocare a tempo di esecuzione il numero esatto di elementi che ti servono. Se conosci a priori il numero di elementi che ti servono non ha senso usare l'allocazione dimanica. Se ti servono 372 elementi ne allochi 372, li azzeri per stare sicuro e poi li usi.

ciao
Certo, questo lo so. Ma non so quanti elementi avro', per questo la uso
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2006, 00:39   #10
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da Unrue
No, sto usando Borland C++ Builder 6
aaargh
non avevo considerato la Borland

be' comunque la stessa cosa in determinati casi capita anche col VC++

ciao
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2006, 10:57   #11
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6851
Quote:
Originariamente inviato da 71104
aaargh
non avevo considerato la Borland

be' comunque la stessa cosa in determinati casi capita anche col VC++

ciao
Mi sai dire se, quando scrivo int*a= new int[1000]
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.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2006, 11:35   #12
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Quote:
Originariamente inviato da Unrue
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?
La new allora uno spazio in memoria pari a quello che specifichi. Ma non puoi anche costringerla ad inizializzare tutta la memoria che alloca. Cosa vorresti ci fosse dentro? Tutti 0? Tutti 1? La new alloca la memoria, poi sta a te inizializzarla.
Se vuoi fare tutto in un colpo, in questo modo inizializzi tutto a zero:
Codice:
nodiaperti = new int[1000]();
Altra cosa: e' buona norma poi mettere a zero il puntatore dopo la delete.

Codice:
delete[] nodiaperti;
nodiaperti = 0;
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2006, 11:44   #13
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6851
Quote:
Originariamente inviato da shinya
La new allora uno spazio in memoria pari a quello che specifichi. Ma non puoi anche costringerla ad inizializzare tutta la memoria che alloca. Cosa vorresti ci fosse dentro? Tutti 0? Tutti 1? La new alloca la memoria, poi sta a te inizializzarla.
Se vuoi fare tutto in un colpo, in questo modo inizializzi tutto a zero:
Codice:
nodiaperti = new int[1000]();
Altra cosa: e' buona norma poi mettere a zero il puntatore dopo la delete.

Codice:
delete[] nodiaperti;
nodiaperti = 0;

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.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2006, 11:48   #14
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da Unrue
Mi sai dire se, quando scrivo int*a= new int[1000]
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.
così è dinamica:
Codice:
int *a = new int[1000];
int *b = new int[dim];
e così è statica:
Codice:
int a[1000];
inoltre alcuni compilatori (come il gcc) ti permettono anche di scrivere cose tipo
Codice:
int b[dim];
ma sono veramente orribbili con due B.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2006, 12:01   #15
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Quote:
Originariamente inviato da Unrue
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.
Al massimo equivale a:
Codice:
int a[10];
int *b = a; // dove 'a' equivale a &a[0]
E non è come l'allocazione statica, perchè puoi allocare memoria "su richiesta". E' chiaro che poi entrambe allocano memoria.

Quote:
Originariamente inviato da Unrue
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.
Da quel che mi pare di capire, una lista sarebbe più pertinente come struttura.
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2006, 12:01   #16
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6851
Quote:
Originariamente inviato da 71104
così è dinamica:
Codice:
int *a = new int[1000];
int *b = new int[dim];
Pero' scusa, se scrivo :

int *a = new int[1000];

cosa c'e' di dinamico? La dimensione dell'array è fissata a priori.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2006, 13:59   #17
Angus
Senior Member
 
L'Avatar di Angus
 
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.) }
Angus è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2006, 14:05   #18
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6851
Quote:
Originariamente inviato da Angus
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
Si, questo è vero. pero' continuo a non capire cosa ci sia di dinamico se scrivo
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.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2006, 15:09   #19
84seawolf
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!
84seawolf è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2006, 20:24   #20
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6851
Quote:
Originariamente inviato da 84seawolf


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!
Si lo so, infatti ho usato anche la classe template vector
Unrue è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro WoW: Midnight, Blizzard mette il primo, storico ...
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere? Recensione Samsung Galaxy S26+: sfida l'Ultra, m...
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti Zeekr X e 7X provate: prezzi, autonomia fino a 6...
Marathon: arriva il Fortnite hardcore Marathon: arriva il Fortnite hardcore
Nutanix accelera la migrazione da VMware...
Nutanix apre ai neocloud: piattaforma mu...
Nutanix amplia la piattaforma cloud e st...
Le fotografie dell'eclissi solare e dell...
Oracle AI Database si potenzia con nuove...
Russia offline: blackout internet mobile...
Gemini, Google investe 30 milioni per la...
Roborock Qrevo Edge S5A: 17.000 Pa, acqu...
Resa pubblica la foto della ''Terra che ...
Il robot che ha piegato 200 scatole di f...
SteelSeries Aerox 3 Wireless Gen 2: nuov...
"Quasi sociopatico": Sam Altma...
Star Wars Eclipse in difficoltà: ...
Gestione del team e romance organiche: l...
Intel lancia Core Ultra X9 378H: hardwar...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 01:11.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v