Il tuo suggerimento non è corretto.
int A[x][y];
(dove 'x' e 'y' sono espressioni che possono essere valutate a una costante in fase di compilazione) dichiara un singolo blocco di memoria che è x y sizeof (int) byte lungo, e A [i] [j] è tradotto in un riferimento al valore I * y + jth nel blocco. D'altra parte,
int ** A = new int * [x];
alloca una matrice di puntatori x a int arrays di dimensioni sconosciute e non inizializza quei puntatori per puntare a qualcosa di specifico. Ci sono due conseguenze a questo:
-
Prima di poter utilizzare l'array dovrai anche allocare un blocco per ogni riga e archiviarlo nell'array di puntatori di primo livello, e
- mentre non è necessario modificare la sintassi che si sta utilizzando per accedere all'array (A [i] [j] funzionerà ancora), tenere presente che il codice generato dal compilatore deve caricare un puntatore dall'alto livello array e quindi preforma l'aritmetica su quello per trovare la posizione dell'elemento, che è meno efficiente.
Dovresti anche, come menzionato nei commenti, assicurarti di eliminare tutto ciò che crei. Tieni presente che l'eliminazione degli array in c ++ richiede l'uso di "cancella []" piuttosto che l'eliminazione ordinaria.
Dato che stai lavorando in c ++, ti consiglio di prendere in considerazione l'utilizzo dell'STL "array < >" digita se conosci la dimensione degli array in fase di compilazione:
unique_ptr<array<array<int,y>,x> > pA(new array <array <int, y>, x> >);
auto &A = *pA;
dovrebbe consentire di utilizzare la stessa sintassi a cui sei abituato, allocare tutta la memoria in un singolo blocco sullo heap, quindi utilizzarlo è efficiente come il tuo codice originale e occuparti di eliminarlo automaticamente quando è ora fuori ambito.