2017-01-30 10 views
-3

私はバグが動的配列の削除操作に関連していると思う。しかし、私は詳しくは分かりません。短いC++コードのバグです。クラスの解体機能が原因だと思います。しかし、私は見つけることができません

私は今、自分自身を勉強しているので、私は完全にフレッシュハンドです。これは本の小さな運動であり、私はそれを解決しようとしています。 "main()"関数の部分は元のものなので、 "Array2"クラスについてのみコードすることができます。

ありがとうございます!

#include <iostream> 
    #include <cstring> 
    using namespace std; 
    class Array2 
    { 
     int row, col; 
     int **a; 
    public: 
     Array2(int s1=1, int s2=1) 
     { 
      row = s1; 
      col = s2; 
      a = new int *[row]; 
      for (int i = 0; i < row; i++) 
      { 
       a[i] = new int[col]; 
      } 
     }; 
     Array2(Array2 & b) 
     { 
      a = b.a; 
     } 
     ~Array2() 
     { 
      for (int i = 0; i < row; i++) 
      { 
        delete[] a[i]; 
      } 

      delete[] a; 
     } 
     int * operator [] (int i) 
     { 
      return a[i]; 
     } 
     int operator() (int s1, int s2) 
     { 
      return a[s1][s2]; 
     } 

    }; 
    int main() { 
     Array2 a(3, 4); 
     int i, j; 
     for (i = 0; i < 3; ++i) 
      for (j = 0; j < 4; j++) 
       a[i][j] = i * 4 + j; 
     for (i = 0; i < 3; ++i) { 
      for (j = 0; j < 4; j++) { 
       cout << a(i, j) << ","; 
      } 
      cout << endl; 
     } 
     cout << "next" << endl; 
     Array2 b; b = a; 
     for (i = 0; i < 3; ++i) { 
      for (j = 0; j < 4; j++) { 
       cout << b[i][j] << ","; 
      } 
      cout << endl; 
     } 
     return 0; 
    }** 
+2

コピーコンストラクタが間違っています。同じメモリが 'delete'dされて複数回実行されます。 – DeiDei

+1

また、誰かがデストラクタをdeconstructorと呼ぶのは初めてですが、クールだと思います。 – DeiDei

+0

笑、ありがとう! – user7487638

答えて

0

問題はこのコードスニペットでの割り当てです。

Array2 b; b = a; 
      ^^^^^ 

コピー代入演算子を定義していません。したがって、コンパイラーは、コピーコンストラクターを間違って定義したのと同じように暗黙的に定義します。

コピーコンストラクタを使用して、またはコピー代入演算子を使用して代入中に、オブジェクトのディープコピーを作成する必要があります。

それ以外の場合は、複数のポインタが少なくとも2回削除される同じメモリを指します。

+0

ありがとう!できます。 – user7487638

1

コピーコンストラクタが正しくありません。内部ストレージのアドレスだけをコピーすることはできません。そうしないと、2度解放されます。

+0

ありがとう!できます。 – user7487638

関連する問題