fatal error - called with threadlist_ix -1
-
Ich habe folgendes Problem. Es sei eine Matrix mit der ich so einiges anstellen kann, jetzt möchte ich den operator = überschreiben, das mach ich folgendermaßen
Matrix & Matrix::operator=(const Matrix &m){ if(this == &m){ return *this; } //delete all rows for(int row = 0; row < rows; row++) { delete matrix[row]; } //delete the pointer to the rows delete matrix; //new Assignments cols = m.cols; rows = m.rows; //built the new Matrix matrix = new double*[rows]; //copy values for(int row = 0; row < rows; row++) { matrix[row] = new double[cols]; for(int col = 0; col < cols; col++){ matrix[row][col] = m.matrix[row][col]; } } return *this; }wenn ich aber in meinem testfile folgendes sage bekomm ich immer diesen Fehler:
6 [sig] test 6304 c:\Uni\Info\C++\Uebung\Blatt8\test.exe: *** fatal error - called with threadlist_ix -1#include <iostream> #include "Matrix.hh" int main(void){ Matrix a(2,2); a.setElem(0,0,0); a.setElem(0,1,1); a.setElem(1,0,2); a.setElem(1,1,3); Matrix b(2,2); b.setElem(0,0,0); b.setElem(0,1,1); b.setElem(1,0,2); b.setElem(1,1,3); Matrix d = a + b + b + a; std::cout << d.getElem(0,0) << " " << d.getElem(0,1) << std::endl; std::cout << d.getElem(1,0) << " " << d.getElem(1,1) << std::endl; Matrix e = d - a; std::cout << e.getElem(0,0) << " " << e.getElem(0,1) << std::endl; std::cout << e.getElem(1,0) << " " << e.getElem(1,1) << std::endl; Matrix f = a; }beim letzten Statement bekomm ich den Fehler, die anderen Sachen laufen so durch wie sie sollten, wobei der + und der - Operator auch schon überschrieben sind. Woher kommt das?
mfg
-
Du hast die Matrix mit new[] aufgebaut, da mußt du sie auch mit delete[] wieder löschen.
(außerdem verwendest du in der main() gar nicht den operator= (der ist nur für "normale" Zuweisungen), sondern den Copy-Construktor)
-
stimmt die Klammern hatte ich vergessen. Aber wenn ich die setze erhalte ich den Fehler immernoch..Wie müsste das ganze denn aussehen, damit ich den neuen = operator benutze? Wenn ich den nicht benutze ist klar wo der Fehler herkommt, denn dann wird mir ja nen Default Copy Constructor erzeugt, der mit nur den Pointer kopiert und nicht die komplette Matrix
-
Rocko105 schrieb:
Wie müsste das ganze denn aussehen, damit ich den neuen = operator benutze?
Das hier nutzt den operator=():
Matrix d; d=a+b+b+a;Wenn ich den nicht benutze ist klar wo der Fehler herkommt, denn dann wird mir ja nen Default Copy Constructor erzeugt, der mit nur den Pointer kopiert und nicht die komplette Matrix
Die Lösung dafür ist ganz einfach - du mußt den Copy-Ctor auch überladen, um die Matrix-Inhalte zu kopieren (die berühmte "Rule of Three").
-
"Rule of Three" hab ich noch nie gehört..Das mit dem CopyConstructor leuchtet mir ein, bin fälschlicherweise davon ausgegangen, dass Matrix a =.. automatisch den operator= aufruft, deshalb hatte ich das auskommentiert. Danke soweit!
-
-
Dann hab ich in gewisser Weise doch schonmal von gehört
nur noch in unter diesem Namenmfg