Newsgroup: it.comp.lang.c++
Titolo: Allocazione dinamica della memoria

Devo fare un programma di prova che chiede in input un numero n abbastanza
grande e lo usa per creare un array di n elementi. Vorrei sapere se si può
fare e come. Nel caso sia fattibile, vorrei sapere se in caso di esaurimento
della memoria il programma si bloccherà o se ci sarà un messaggio tipo "out
of memory" e si terminerà.
grazie
--
San Vegeta from Hell
http://www.geocities.com/Area51/Dungeon/8436
http://come.to/Fantasy.it

 grazie
char *p;
int n;
scanf("&i",n);
if ((p=new(char[n]))==NULL)
	printf("E' finita la memoria");
else
	printf("Ho allocato un vettore di %i char",n);
ciao.
-- 
     (ZZZ)       Filippo Salotti, Bagni di Lucca, Lucca, Italy.
    //   \\  _                 E-mail : 
fil...@humnet.unipi.it
   /Y\    ZD<_o===============================================o
 .oZZZZZo.     | Studente Ingegneria Informatica Automatica  |
<OXXXXXXXO>    | Dip. Sistemi Elettrici Universita' di Pisa. |


Considerato che questo NG ha come tema il C++, mi sembrerebbe piu`
giusto fornire una soluzione C++, anche perche` l'esempio sopra riportato
non e` detto che funzioni (il fallimento di new a norma di standard provoca
una eccezione std::bad_alloc se non ricordo male):
unsigned int ArraySize;
cout << "Immettere la dimensione dell'array: ";
cin >> ArraySize;
char* p = 0;
try {
  p = new char[ArraySize];
}
catch (std::bad_alloc) {
  cout << endl << "Out of memory... << endl;
  abort();
}
Spero che non ci siano errori nell'esempio... non sono ancora
molto pratico con le eccezioni...
Paolo
----------------------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
----------------------------------------------------------

 printf("Ho allocato un vettore di %i char",n);
Grazie per la risposta, ma ora mi è sorto un dubbio. Se dichiaro "int n",
poi non devo scrivere:
((p=new(int[n]))==NULL) ???
Se no, mi dici perchè?
ciao e grazie


 Se no, mi dici perchč?
la riga:
if ((p=new(int[n]))==NULL) ...
serve per sapere se p e' un indirizzo valido oppure no, int[n] dentro la
new serve invece per specificare che voglio allocare un'area di memoria
adatta per contenere n interi (un vettore), cioe sizeof(int)*n.
Ciao.


 if ((p=new(char[n]))==NULL)
if ((p=new char[n])==NULL)
E magari, alla fine:
delete p;
Comunque questo sistema non funziona piů in C++ standard (se non
sbaglio) e si deve invece gestire l'eccezione generata dall'operatore
new in caso di errore.
EMG

 new in caso di errore.
--- MSDN  --  VC++ 6.0 -----------
When a statement such as the following is encountered in a program, it
translates into a call to the function operator new:
char *pch = new char[BUFFER_SIZE];
If the request is for zero bytes of storage, operator new returns a
pointer to a distinct object (that is, repeated calls to operator new
return different pointers). If there is insufficient memory for the
allocation request, by default operator new returns NULL.
----------------------------------


 allocation request, by default operator new returns NULL.
Allora il VC++ 6.0 non e' standard.  Spero che almeno si possa
cambiare il default.
	Mauro

 allocation request, by default operator new returns NULL.
Ribadisco che l'unica fonte attendibile riguardo lo standard è lo
standard stesso e non la documentazione di qualche compilatore.
EMG

 standard stesso e non la documentazione di qualche compilatore.
Giustissimo, pero' si deve scrivere i programmi per gli ambienti a
disposione (altrimenti non vanno!) e la mia prima risposta era rivolta
alla realizzazione di uno spezzone di codice funzionante per gli
ambienti in uso. 
Credo che, almeno per compatibilita, il valore NULL sara' restituito
ancora per molto tempo (ma potrei anche sbagliare visto che non conosco
con precisione la parte riguradante le eccezioni).
Comunque per concludere lo standard e' bello, ma esistono ambienti che
attualmente  lo supportano (almeno limitatamente a questo argomento)? 
Ciao.


 
ah!
dimenticavo per deallocare un vettore si usa:
delete[] p;


 attualmente  lo supportano (almeno limitatamente a questo argomento)? 
egcs mi sembra che sia molto vicino allo standard.
Saluti,
Paolo
-- 
------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
 
http://www.cli.di.unipi.it/~marotta
------------------------------------------

 disposione (altrimenti non vanno!)
Questo è vero. Però uno dovrebbe partire dando consigli basati sullo
standard altrimenti si rischia di parlare di un linguaggio che non
esiste più e che magari è diverso per ognuno di noi. Nell'incertezza
forse è meglio parlare di standard e basta. Poi se uno si accorge che il
suo compilatore non supporta quella particolare caratteristica (come mi
capita abbastanza frequentemente con il mio DJGPP) sarà lui stesso a
dover escogitare una soluzione specifica. Non sei d'accordo?
EMG

 delete[] p;
Accidenti a me! Hai ragione, certo che hai ragione...
EMG