PDA

View Full Version : [c++] Gestione della Memoria!


nin
06-12-2005, 17:02
Ciao a tutti!
Vorrei sottoporvi un caso immagino molto semplice, ma non riesco a trovare un modo poco complicato per risolvere la cosa.
Supponiamo di avere questo ordinario spezzone di codice:


int main(){
int **griglia = 0;
int lato = 0;
cin >> lato;
griglia = new int*[lato*lato];
..
..
delete[] griglia;
return 0;
}


So che new non ritorna NULL se la dimensione della griglia che si vuole allocare supera la memoria disponibile o se si incappa in qualsiasi altro errore.
In effetti con g++ mi vedo ritornare un eccezione di tipo bad_alloc che non so come gestire: vorrei che il programma non si fermasse ma cancellasse quanto allocato e riproponesse l'inserimento della dimensione fin tanto che l'operazione non va a buon fine.
Come posso fare? Chiedo troppo?

maulattu
06-12-2005, 19:14
Ciao a tutti!
Vorrei sottoporvi un caso immagino molto semplice, ma non riesco a trovare un modo poco complicato per risolvere la cosa.
Supponiamo di avere questo ordinario spezzone di codice:


int main(){
int **griglia = 0;
int lato = 0;
cin >> lato;
griglia = new int*[lato*lato];
..
..
delete[] griglia;
return 0;
}


So che new non ritorna NULL se la dimensione della griglia che si vuole allocare supera la memoria disponibile o se si incappa in qualsiasi altro errore.
In effetti con g++ mi vedo ritornare un eccezione di tipo bad_alloc che non so come gestire: vorrei che il programma non si fermasse ma cancellasse quanto allocato e riproponesse l'inserimento della dimensione fin tanto che l'operazione non va a buon fine.
Come posso fare? Chiedo troppo?

così:


int main(){
int **griglia = 0;
int lato = 0;
cin >> lato;
try {
griglia = new int*[lato*lato];
} catch(bad_alloc x) {
// gestisci qui l'errore di allocazione
}
..
..
delete[] griglia;
return 0;
}

nin
06-12-2005, 19:21
Grazie molto rapido e chiaramente funziona :) !
.. Edit...

nin
06-12-2005, 19:28
..un'ultima cosa, come posso gestire l'errore in modo che mi cicli l'istruzione di inserimento della dimensione?
Una cosa del tipo:

...
do {
cin >>lato;
try{
griglia= new...
}
catch{...}
} while (errore);
...


Spero di essermi spiegato :)

andbin
07-12-2005, 08:28
..un'ultima cosa, come posso gestire l'errore in modo che mi cicli l'istruzione di inserimento della dimensione?
Ciao, puoi fare così (è una delle tante possibilità):

while (1)
{
cin >> lato;

try {
griglia = new int*[lato*lato];
break; // Esci dal loop
} catch(bad_alloc x) {} // Niente
}

maulattu
07-12-2005, 08:47
buona lettura:
http://www.cplusplus.com/doc/tutorial/

:read:

nin
07-12-2005, 12:24
:doh:
Grazie mi ero intestardito sull'idea di utilizzare l'errore come argomento del ciclo, quando in effetti potevo impostare il loop in tutt'altra maniera..Poca esperienza non c'è che dire.