Destruktor wird zweimal ausgeführt -> Heap-Fehler!
-
Ich will mir eine kleine matrix-Bibliothek schreiben, bekomme aber bei folgendem Teil immer die Fehlermeldung "Invalid Address specified to RtlFreeHeap( 00320000, 003210C8 )". Hier der Code:
#include <iostream.h> #include <assert.h> class Matrix { private: double *m_data; int m_rows, m_cols; public: Matrix(int rows, int cols) { int i; m_rows = rows; m_cols = cols; m_data = new double[m_rows*m_cols]; for (i = 0; i<(m_rows*m_cols); i++) m_data[i] = 0.0; }; ~Matrix() { cout<<"Determiniere"<<endl; delete[] m_data; }; Matrix test() { Matrix myNew(2,2); cout<<"vor return aus test()"<<endl; return myNew; }; }; int main() { double tmp; Matrix myMatrix(3,3); myMatrix.test(); cout<<"nach test"<<endl; cin>>tmp; return 0; };Als Bildschirmausgabe bekomme ich:
vor return aus test
Determiniere
DeterminiereWieso 2x Determiniere?
-
Komisch, ich bekomm vom Compiler
Error 1 fatal error C1083: Cannot open include file: 'iostream.h': No such file or directory...
Standard ist
#include <iostream> #include <cassert> using namespace std; /* ... */Das erste "Determiniere" stammt von
Matrix test() { Matrix myNew(2,2); cout<<"vor return aus test()"<<endl; return myNew; /* hier */ }greetz, Swordfish
-
WoolyPooly schrieb:
Wieso 2x Determiniere?
Wenn du zwei erzeugst, dann werden auch zwei zerstört. Siehe Zeile 29 und 39.
-
Erstmal vielen Dank für die rasche Antwort.
Leider taucht der Fehler noch immer auf.Ich denke, dass auch das 2. "Determiniere" von dem
return myNewausgelöst wird. Denn die Ausgabe "nach test" bekomme ich gar nicht mehr. Und erst danach dürfte ja die Matrix myMatrix gelöscht werden.
-
WoolyPooly schrieb:
Erstmal vielen Dank für die rasche Antwort.
Leider taucht der Fehler noch immer auf.Was hast du denn geändert?
Ich denke, dass auch das 2. "Determiniere" von dem
return myNewausgelöst wird. Denn die Ausgabe "nach test" bekomme ich gar nicht mehr. Und erst danach dürfte ja die Matrix myMatrix gelöscht werden.
Wieso bekommst du die Ausgabe "nach test" nicht?
Ach so, dein Debugger kickt dich raus, weil du delete [] auf ein pointer, der irgendwo ins nichts verweist, aufrufst. Wie wäre es einfach mal den Copy-C'tor zu implementieren. Dann würdest du korrekt drei "determiniere" bekommen
-
Wieso gibt der D'tor überhaupt "Determiniere" = "bestimme" aus?
-
Einmal wird ein Destruktor(dtor) aufgerufen weil in test() ein lokales Objekt des Klasse Matrix erstellst und dies beim Verlassen des Blocks (hier also der Funktion test()) destruiert wird.
Dann verwirfst Du den Rückgabewert von test() - zweiter dtor-Aufruf für das zurückgegebene Objekt.
Dein Code kann so nicht funktionieren; in test() wird implizit der Default-Copy-Konstruktor von Matrix aufgerufen; der erzeugt aber nicht automatisch das Feld das Du später mit delete[] wieder löscht!
Das solltest Du ändern indem Du einen eigenen Copy-Konstruktor "Matrix(const Matrix**&** old)" definierst und auch darin das Feld erzeugst.
Btw. "Destruieren" und nicht "Determinieren".
Grüsse
*this
-
Vielen vielen Dank.
Jetzt funzt's.Und gut: Determiniere ist falsch. De-(struiere)+Terminiere = Determiniere

Zum Debuggen hats aber den gleichen Sinn erfüllt.Vielen Dank nochmal...