Ich bin immer noch lernen c + + und haben eine Frage, die offensichtlich sein kann, oder vielleicht weiß ich einfach nicht, was ich versuche zu tun. Ich habe Funktionen, die eine Matrix (eine Klasse, die ich geschrieben habe, die einen richtig geschriebenen Destruktor hat) nehmen und eine neue Matrix daraus erstellen und eine Referenz auf die neue zurückgeben. Ich muss möglicherweise Zehntausende von Malen auf diese Matrizen iterieren, also muss ich sicherstellen, dass ich keine Speicherlecks habe. Die Frage ist also, wie kann ich die Matrix, die ich nicht mehr benötige, richtig löschen, um Platz für die nächste zu schaffen? Hier ist der Code, den ich versuche, leckfrei zu machen:
DynamicMatrix<double> x0 = getX0(n);
DynamicMatrix<double>exactU = getExactU(n);
DynamicMatrix<double> b = getB(n) * w;
DynamicMatrix<double> x1 = getX1(x0, b, w, n);
while( !isConverged(exactU,x1,e) ){
delete x0; //<<<<< This doesn't work. Nor does delete &x0.
x0 = x1;
x1 = getX1(x0, b, w, n);
}
Jede der getX()-Methoden erzeugt einen Zeiger auf eine Matrix und gibt einen Verweis auf die Matrix wie in getX0() zurück:
DynamicMatrix<double> &getX0(int n){
DynamicMatrix<double>* mat1 = new DynamicMatrix<double>(n * n,1);
for (int i = 1 ; i <= n; i++){
for (int j = 1; j <= n; j++){
mat1->set((i-1)*n +j, 1, 0);
}
}
return *mat1;
}
Der Aufruf von 'delete X0' schlägt also fehl, weil er einen Zeiger benötigt. delete &X0' sagt, dass der freizugebende Zeiger nicht zugewiesen wurde. Was ist der korrekte Weg, dies zu tun? Oder mache ich etwas völlig falsch? Bei zu großen Matrizen und zu vielen Iterationen wird mein groß Auf der Festplatte ist kein Platz mehr frei, was vermutlich bedeutet, dass ich jede Menge Speicherverluste habe.