Originariamente inviato da pipporossonero
hai perfettamente ragione sul delete mea culpa, concordo con l'utilizzo dei reference nella funzione alloca ma se stessimo scrivendo in C e non in C++, il mio codice utilizzando i tripli puntatori e passando per indirizzo non sarebbe l'unica via percorribile ( e se si dove ho sbagliato ? )...grazie per la risposta !
In C oltre alla variabili globali (sconsigliate) l' unico modo era usare i tripli puntatori.
Attenzione alla precedenza degli operatori:

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]; // l' operatore [] ha la precedenza
     }
}
q è un puntatore a puntatore allocato nello stack, locale alla funzione alloca (è stato allocato automaticamente nello stack per contenere il valore di quello che nel main è &p).
Quando i vale zero non c'è problema ad accedere a *q[i] perchè i vale zero.
La tua intenzione non era:
-Prima spostarti di i posizioni da q;
-Poi deferenziare il risultato della sotto-espressione ottenuta (cioè q[i]).
Ma invece volevi:
-Deferenziare q;
-Spostarti di i posizioni da *q.
Perchè *q contiene quello che nel main è p, ma *(q+1) probabilmente non c'è nello stack.
E questo lo devi correggere in tutto il codice, non solo nella alloca.
Altra cosa: per la get non servivano i tripli puntatori visto che stai solo cambiando i valori contenuti nella matrice.Poi le variabili i e j non le dichiarare globali, ma instanziale nel for:
codice:
for(int i=0;i<d;i++) {...}

Figura di merda...è vero Viene creata una nuova variabile all'interno della funzione e poi viene persa...
Ma no anzi, le migliori cose si imparano sbagliando clamorosamente , perchè non te le dimentichi mai