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 Namen

    mfg


Anmelden zum Antworten