
Originariamente inviata da
shodan
Per il primo post.
No, delete serve per cancellare singoli puntatori allocati con new mentre delete[] si usa per deallocare puntatori allocati con new[]
Es.
codice:
int* alfa = new int; // alloco un singolo elemento con new
delete alfa; // cancello l'elemento con delete
int* beta = new int[16]; // alloco un array con new[]
delete[] beta; // cancello l'array con delete[]
Fare una semplice delete su qualcosa allocato con new[] ha comportamento indefinito.
Non centrano nulla le matrici.
Per il secondo post.
...finché inserisci un elemento. Se provi a inserirne più di uno, prima o poi avrai un crash.
int vettore; è UN int e basta, NON è un array di int. Usarlo come hai fatto nel primo esempio è un grave errore.
Puoi allocare dove e quando ti pare, non ci sono limitazioni (memoria d sistema a parte), ma se vuoi che il secondo esempio funzioni devi passare il puntatore al puntatore in modo da poter modificare ciò che è all'esterno.
(Come avviene con le liste.)
codice:
void LeggiArray(int** vettore ,int r){
cout<<"Quanti elementi si vuole inserire nel vettore?\n";
cin>>r;
(*vettore)=new int[r];
for(int i=0;i<r;i++){
cout<<"inserire l'elemento in posizione "<<i<<endl;
cin>>*((*vettore)+i);
}
}
void StampaArray(int* vettore,int r){
for(int i=0;i<r;i++)
cout<<*(vettore+i)<<endl;
}
int main(int argc, char** argv) {
int *vettore,r;
LeggiArray(&vettore,r);
StampaArray(vettore,r);
delete[] vettore; // non dimenticare questa.
return 0;
}
Se ti sembra strano, rifletti sul fatto che se scrivi:
codice:
int alfa = 10;
int* beta = &alfa;
*beta = 20;
e ti ritrovi con alfa che vale 20, allo stesso modo se scrivi;
codice:
int* alfa = nullptr;
int** beta = &alfa;
(*beta) = new int(30); // Attenzione! Non [30]. Con (30) do direttamente il valore al singolo elemento.
in *alfa ti ritrovi 30. Il motivo è che (*beta) è proprio alfa.