2016-04-24 9 views
-1
Matrix &Matrix::operator*(Matrix &rhs) { 
    if (this->columns != rhs.rows) { 
     this->~Matrix(); 
     return *this; 
    } 
    else { 
     Matrix product(this->rows, rhs.columns); 


     /*for (unsigned int col = 0; col < product.columns; col++) { 
      for (unsigned int row = 0; row < product.rows; row++) { 
       unsigned int val = 0; 
       for (unsigned int i = 0; i < this->columns; i++) { 
        val += this->get(row, i)*rhs.get(i, col); 
       } 
       product.set(row, col, val); 
      } 
     }*/ 

     return product; 
    } 

コードはビルドされますが、実行中にクラッシュします。デバッグするとき私はエラーがコピーコンストラクタ(this->matrix = new double[rows*columns];)にあるというメッセージことを得るC++プログラムは正常にビルドされますが、実行時にエラーが発生します

Matrix::Matrix(const Matrix&m):rows(m.rows),columns(m.columns),matrix(nullptr) { 
    if (!m.isValid()) { 
     return; 
    } 
    this->matrix = new double[rows*columns]; 
    for (unsigned int i = 0; i < rows*columns; i++) { 
     matrix[i] = m.matrix[i]; 
    } 
} 

私はなぜ理解していませんか?コピーコンストラクタは、*演算子を実装する直前に動作していました。私は本物のエラーを見つけるために一枚ずつコメントしました。返品のためにプログラムがクラッシュするようです。ステートメント。そして、私はfor-loopsをコメントアウトしたので、問題はありません。

メインから私のテストは単純です:

#include "Source.h" 
#include "Matrix.h" 
#include<iostream> 

int main() { 
    Matrix A(3,3); 
    Matrix B(3); 
    cout << B << endl; 
    cout << A << endl; 
    Matrix C=A*B; 
    cout << C << endl; 

    return 0; 
} 

私は本当にこだわっていますので、私は、誰も私を助けることができると思います。ここ は、プログラム全体へのリンクです:

+0

プログラムはちょうどそれが構文的に有効であることを意味しコンパイルされること。これは、実行しているときに動作を定義しているかどうか、または結果を生成するために何も意味しません。ただのメモ。 –

+0

あなたの*演算子の*ローカル一時変数*に*参照*を返すのに役立つわけではありません。それがUBです。 – kfsone

+0

[MCVE]を入力してください。また 'this->〜Matrix();'は非常に間違っているようです。 – Barry

答えて

2

あなたのコード内のoperator *方法は、ローカル変数への参照を返します。ローカル変数productは範囲外になり、returnのときに破棄されて、最終的に未定義のビヘイビアで終わるダングリングリファレンスを返すことになります。

operator *の戻り値の型は、おそらくMatrix代わりMatrix &のようになります。

Matrix Matrix::operator*(Matrix &rhs) { /* ... your code here ... */ } 
+0

ありがとう、本当に助けてくれました。それは私には本当にうんざりでした:/ – user6248314

関連する問題