Eliminazione di una matrice irregolare allocato dinamicamente
-
10-10-2019 - |
Domanda
Ho un array di puntatori che fanno riferimento a matrici di interi. Ho fatto una serie hard coded di int (controllo di 'allineamento' sotto) e voglio inserirla nella matrice di puntatori (assegno 'bar' di seguito), per quanto posso dire, è ancora un array di puntatori che scegliere array di interi.
Si compila bene; nessun avviso. Funziona benissimo; e chiude bene; Fino a quando almeno, introduco il momento commentato la dichiarazione di eliminazione nel distruttore.
Mi immagino il mio compilatore sarebbe un distruttore meglio a questo punto, ma mi interessa di ciò che sto facendo male. La finestra di terminale appena getta fuori una mappa di memoria gigantesca; e googling e la ricerca SO non ha aiutato molto.
class foo {
public:
int **bar;
int aSize;
//CONSTRUCTOR
foo(int aSize) {
this->aSize = aSize;
bar = new int*[aSize];
for (int i=0;i<aSize;i++) {
bar[i] = new int[aSize + i];
for (int j=0;j<(aSize + i);j++) {
bar[i][j] = 0;
}
}
}
void myfunc(int *pointer) {
bar[0] = pointer;
}
~foo() {
for (int i=0;i<aSize;i++) {
//delete[] bar[i];
}
delete[] bar;
}
};
int main() {
foo *obj = new foo(5);
int array[] = {1,2,3,4};
obj->myfunc(array);
delete obj;
return 0;
};
So che ho qualcosa probabilmente fatto tragico; Solo che non so di cosa si tratta. C'è un motivo per cui non sto usando STL o di altri modelli, è semplicemente perché io sono interessato a imparare questo. critica massimo apprezzato.
Soluzione
La funzione myfunc
prende in un puntatore, e quindi imposta bar[0]
a quell'indirizzo di memoria. Nel codice esempio, si passa l'indirizzo della array
, che è una variabile automatica (stack). Il distruttore tenta quindi di delete[] bar[0]
, che punti ad un variabile di stack . Questo è completamente indefinito comportamento , e il motivo per il programma si blocca. Non si può delete[]
una pila di allineamenti. È possibile delete[]
solo una matrice che è stato allocato utilizzando new[]
.
Inoltre, la funzione myfunc
sta andando sempre una perdita di memoria, perché i punti bar[0]
ad una matrice heap allocato. Quando si imposta bar
ad un indirizzo di memoria diverso senza prima delete[]
ing l'indirizzo precedente, si sono perdite di memoria.
Altri suggerimenti
Il problema sta chiamando myfunc
. In tale funzione, si sta sostituendo un puntatore (bar[0]
) che la classe pensa di sua proprietà. Il tuo obj
distruttore sarà poi di conseguenza tenta di eseguire delete[]
sul array[]
in main
, che probabilmente fa sì che il crash del e lascia la penzoloni bar[0]
originale.