Newsgroup: it.comp.lang.c++
Titolo: Array dinamico di Oggetti

Salve Ragazzi!!! Ho bisogno del vostro prezioso aiuto...
ho creato una classe di nome NumeroBase che ha dei costruttori e dei metodi
che funzionano alla precisione...ora però devo aggiungere un altro metodo
che mi crea un vettore di oggetti di questa classe e ho bisogno di fare
un'allocazione dinamica come posso fare?
Se faccio così il compilatore mi dà errore:
NumeroBase vet=new NumeroBase[dim]
dove dim è un intero che contiene la dimensione da allocare.
Allora??
Confido nel vostro aiuto...siete Grandi!!!
Gi@nni


NumeroBase *vet=new NumeroBase[dim];
--
Pela

Ciao Gianni,
Il tuo errore rientrerebbe tra quelli di logica.
Se vuoi allocare dinamicamente un oggetto, l'operatore new
ti restituisce un puntatore agli elementi allocati ( ti ricordo nell'area
HEAP) quindi ti devi dichiarare un puntatore
al tipo che vuoi allocare. Esempio.
    NumeroBase* vet = new NumeroBase[dim];
Attento alla deallocazione :
    delete [] vet;                 // Gli indica chedeve deallocare un
array.
Ciao Gianni, fammi sapere.

 array.
Ma se non sbaglio anche facendo solo
delete vet;
la memoria viene deallocata, le parentesi [] sono solo un'indicazione per il
programmatore, se invece si vogliono deallocare i primi n elementi del
vettore:
delete [n] vet.



Non mi risulta corretto. Citando dal libro di Stroustrup in italiano
(pag. 283):
<< Come il C, il C++ non distingue tra un puntatore a un singolo oggetto
e un puntatore all'elemento iniziale di un array. Il programmatore
deve quindi dichiarare se si stia distruggendo un array o un singolo
oggetto. >>
Quindi quando la new non ha le quadre, non le deve avere neanche la
delete corrispondente, e quando la new ha le quadre le deve avere anche
la delete corrispondente.
L'espressione "delete [n] vet" non mi risulta valida. A fronte di
un'espressione del genere, il compilatore gcc emette il
seguente messaggio d'errore:
anachronistic use of array size in vector delete
che lascia supporre che in uno standard del passato tale espressione era
consentita, ma ora non lo e' piu'.
-- 
	Carlo Milanesi
 
http://digilander.libero.it/carlmila

Ho fatto una prova:
#include <iostream.h>
#include <stdlib.h>
int main()
{     int* i=new int[6];
      delete i;
      i[5]=1;
      int * a =new int[6];
      a[5]=5;
      cout<<i[5];
      delete a;
      system("PAUSE");
      return 0;
}
L'output č: 5
Se l'operatore delete non cancellasse tutto l'array puntato da i quell'area
di memoria non sarebbe + utilizzabile quindi i[5] resterebbe uguale a 1; il
fatto che l'output č 5 significa che il compilatore dealloca tutto l'array e
alla successiva richiesta di new viene allocata la stessa memoria quindi
l'istruzione a[5]=5 va a sovrascrivere quell' 1 che era presente in
quell'area di memoria, e i[5] == 5.
In pratica delete dealloca tutta l'area di memoria che era stata allocata
con il corrispondente new, sei d'accordo con me?
Per quanto riguarda la notazione delete [n] i  anche a me il compilatore ha
dato lo stesso errore, evidentemente tale notazione non č piů consentita.

 L'output è: 5
E quindi?
Le regole del linguaggio sono chiare: se allochi con 'new', rilasci con 
'delete'; se allochi con 'new[]', rilasci con 'delete[]'. Le altre 
combinazioni non sono consentite, e hanno comportamento indefinito. 
Probabilmente, nel caso di tipi built-in l'uso di 'delete', in luogo di 
'delete[]', non determina inconvenienti di sorta (con la maggior parte o la 
totalità dei compilatori). Nel caso di tipi definiti dall'utente, sarei 
molto meno ottimista.
Max

 ha scritto nel messaggio
news:bpr1po$l7o$1...@newsreader.mailgate.org...

Ma sei d'accordo con me che è stato deallocato tutto l'array?
In ogni caso a me risulta che delete (senza []) dealloca quanto era stato
allocato con il corrispettivo new anche se quest'ultimo è un vettore.

 allocato con il corrispettivo new anche se quest'ultimo è un vettore.
http://www.gotw.ca/gotw/042.htm
buona lettura.
sbirish

 allocato con il corrispettivo new anche se quest'ultimo è un vettore.
A te risulta male. Dove avresti imparato questa fesseria?
Ciao,
Nicola