Ardito, questa funzione qua:
codice:
void alloca(int***q,int d)
{
cout<<"funzione alloca \n ";
*q=(int**)new int[d];
for(i=0;i<d;i++)
{
*q[i]=(int*)new int[d];
}
}
Non funziona se gli passi un doppio puntatore proprio perchè i puntatori vengono passati per valore.
*q=(int**)new int[d];
Ha l' effetto di scrivere sul valore puntato da q la nuova area di memoria allocata.
Se era così:
codice:
void alloca(int**q,int d)
{
cout<<"funzione alloca \n ";
q=(int**)new int[d];
for(i=0;i<d;i++)
{
q[i]=(int*)new int[d];
}
}
Ogni riferimento a q andava perso perchè l' istruzione:
q=(int**)new int[d];
Era un assegnamento valido solo per il q locale a questa funzione.
E il q locale alla funzione è una copia del parametro.
Il passaggio per riferimento è questo:
codice:
void alloca(int**& q,int d)
{
cout<<"funzione alloca \n ";
q=(int**)new int[d];
for(i=0;i<d;i++)
{
q[i]=(int*)new int[d];
}
}
Così viene passato il riferimento a quel puntatore e non ci sono problemi.
Inoltre ricordo a pipporossonero che le cose allocate con new[] vanno liberate con delete[] e non con delete.