2017-09-12 21 views
-2

私は何とかこのデストラクタの内部に発生する無限の再帰(および最終的なスタックオーバーフロー)を引き起こしています:C++:のostream無限再帰

MyMatrix::~MyMatrix() { 
    if (this != NULL) { 
     cout << "Destructor called for " << this->matrix << ":" << endl << *this << endl; 
     /*for (int i = 0; i < m; i++) { 
      for (int j = 0; j < n; j++) { 
       cout << matrix[i][j] << " "; 
      } 
      cout << endl; 
     }*/ 
     delete[] *matrix; 
     delete[] matrix; 
    } 
} 

私は()のループコメントを解除し、初期COUTの端部を削除した場合、関数は正常に動作します。問題はoperator<<のあなたの宣言であるここ はコンストラクタです

MyMatrix::MyMatrix(int i_m, int i_n) { 
    m = i_m; 
    n = i_n; 
    if (n < 1 || m < 1) 
     throw string("Dimensions cannot be negative"); 
    matrix = new float*[m]; 
    for (int i = 0; i < m; i++) { 
     matrix[i] = new float[n]; 
     for (int j = 0; j < n; j++) 
      matrix[i][j] = 0; 
    } 
} 
+0

すべてのコードを投稿してください。 –

+4

'<<'は値によって行列をとります。デストラクタは '<<'を呼び出し、マトリックスのコピーを渡します。そのコピーを破壊する必要があります。デストラクタは '<<'を呼び出し、マトリックスのコピーを渡します。それは破壊する必要があり、デストラクタを呼び出します。これはどこにあるのでしょうか?行く。 –

+3

@ T.C。あなたは '' ''演算子でconst参照を呼び出すべきですが、 'this!= NULL'と'&a!= NULL'も真になり得ないと言います。削除する必要があります。 –

答えて

2

ostream &operator<<(ostream &output, MyMatrix a); 

ostream &operator<<(ostream &output, MyMatrix a) 
{ 
    if (&a != NULL) { 
     for (int i = 0; i < a.m; i++) { 
      for (int j = 0; j < a.n; j++) { 
       output << a.matrix[i][j] << " "; 
      } 
      output << endl; 
     } 
    } 
    return output; 
} 

EDIT:そのため、私は過負荷< <オペレータによって引き起こされていることだと思います

aを値渡ししています。これにより、渡されたMatrixの一時コピーが作成され、operator<<が終了するとそのコピーが破棄されます。 Matrixデストラクタ内でoperator<<を呼び出すと、再帰的ループが発生します。

可能であれば、関数の引数を値で渡すことは避けてください。不要なコピーを作成しないようにしてください。プログラムの速度が遅くなります。この場合、余分なコード(この場合はコピーコンストラクタとデストラクタ)が生成されます。

それは最初からあったはず何に operator<<のあなたの定義を変更し

ostream &operator<<(ostream &output, const MyMatrix &a); 

サイドノート:あなたが示したコードから、あなたがMatrix*を含むMatrixを持っているようです。これは再帰的な構造です。私はこれがマトリックスにとって本当に必要であるとは思わない。

関連する問題