2017-10-04 12 views
-1

私は週のコースでMatrixクラスを作成していましたが、問題を抱えていました。私の関数のreturn文はbad_array_new_length例外を投げています!returnステートメントによってC++のbad_array_new_length例外がスローされましたか?

ここで私はこれを見つけるために使用されるサンプルコードです:

Matrix Matrix::operator*(Matrix& mat) 
{ 
    if (this->columns != mat.rows) 
    { 
     //Do code if Matrix can't be multiplied. 
    } 
    else 
    { 
     Matrix result(this->rows, mat.columns); 

     //Multiply Matrices together. 

     //Print out result to prove the local Matrix works fine. 
     //It does. 

     try 
     { 
      return result; 
     } 
     catch (const exception& e) 
     { 
      cout << "return exception: " << e.what() << endl; 
      return result; //To be caught again in the test. 
     } 
    } 
} 

ローと見よ、私は機能を実行すると、それは「リターン例外:bad_array_new_length」をプリントアウトし、コンソール上には。

try 
{ 
    answer = A1 * B1; //A1 and B1 are able to be multiplied. 
} 
catch (const exception& e) 
{ 
    cout << e.what() << endl; 
} 

テストも例外をキャッチし、同様にそれをプリントアウト:そうは次のように

機能を試験しました。

少しの調査を行った後、bad_array_new_length例外は、配列に無効な長さが指定された場合にのみスローされます。 Matrixクラスは多次元配列を使用してその倍数を格納しますが、ローカルMatrixが意図した通りに完全に動作するため、これは問題の根本ではないと私は考えるでしょう。ここで

は多次元配列は念のために、宣言され、コンストラクタで初期化されている方法です。

//Matrix.h 

unsigned int rows; 
unsigned int columns; 

double ** storage = new double*[rows]; //Multidimensional array isn't completely formed, see the constructor. 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

//Matrix.cpp 

Matrix::Matrix(unsigned int x, unsigned int y) 
: 
    rows(x), 
    columns(y) 
{ 
    for (unsigned int i = 0; i < rows; ++i) //Completes the formation of the multidimensional array. 
     storage[i] = new double[columns]; 

    for (unsigned int i = 0; i < rows; ++i) 
    { 
     for (unsigned int q = 0; q < columns; ++q) 
     { 
      storage[i][q] = 0; //Initializes each value in the array as 0. 
     } 
    } 
} 

///////////////////// ///////////////////////////////////////////////////////////////// //////////////////////////////

編集:ここでは

が定義されたコピーコンストラクタと代入演算子次のとおりです。

Matrix::Matrix(const Matrix& obj) 
{ 
    rows = obj.rows; 
    columns = obj.columns; 

    for (unsigned int i = 0; i < rows; ++i) 
    { 
     for (unsigned int q = 0; q < columns; ++q) 
     { 
      storage[i][q] = obj.storage[i][q]; 
     } 
    } 
} 

//////////////////////////////////////////////////////////////////////////////// 

bool Matrix::operator=(Matrix mat) 
{ 
    rows = mat.rows; 
    columns = mat.columns; 

    for (unsigned int i = 0; i < rows; ++i) 
    { 
     for (unsigned int q = 0; q < columns; ++q) 
     { 
      storage[i][q] = mat.storage[i][q]; 
     } 
    } 

    return true; 
} 
好奇心のうち

、私が唯一であることをテストでコードを変更:

try 
{ 
    A1 * B1; //Removed assignment to answer Matrix. 
} 
catch (const exception& e) 
{ 
    cout << e.what() << endl; 
} 

は例外がまだ通常通り投げた..and。

+0

Matrix Matrix :: operator *(Matrix&mat)のすべてのパスが値を返すわけではありません。 – user0042

+0

'Matrix'クラスには、ユーザ定義のコピーコンストラクタと代入演算子がありません。したがって、 'Matrix'を返すことは、メモリ破損の可能性があるため、未定義の動作です。また、あなたは 'operator *'の1つ以上のコードパスに値を返すことを示していません。ああ、あなたが本当にコピーコンストラクタと代入演算子を書いたのであれば、情報の一部が投稿から除外された最も重要なものだとは思わないでしょうか?すべてが正しく書かれるべき関数に依存しているからです。 – PaulMcKenzie

+0

[3のルールとは何ですか?](https://stackoverflow.com/questions/4172722/what-is-the-rule-of-three) – PaulMcKenzie

答えて

0

クラスの宣言とコンストラクタでメモリがどのように割り当てられたかが変更されただけで問題は解決しました。

関連する問題