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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top