2012-03-16 12 views
1

私は、2次元の整数ポインタフィールドを持つ単純な行列クラスを持っています。関数を複数回呼び出すと、Linuxマシンでglibcエラーが発生します。私は "otherM.value = '\ 0';"この行を関数の最後に追加すると、問題が解決されます。クラスが参照ではなくコピーで渡されていますが、なぜこのぶら下がりポインタの問題があるのか​​、誰かが私に説明できますか?ポインタのメンバーは参照渡しですか?ポインタメンバーによるクラスの受け渡し

void matrix::sub(matrix otherM) 
{ 
if(dimX!=otherM.dimX || dimY!=otherM.dimY) 
    return; 

int** rowPtr = value; 
int** otherMrowPtr = otherM.value; 

for(int i=0;i<dimX;i++){ 
    for(int j=0;j<dimY;j++){       
     (**rowPtr) = (**rowPtr) - (**otherMrowPtr); 
     (*rowPtr)++; 
     (*otherMrowPtr)++; 
    } 
    (*rowPtr)-=dimY; 
    (*otherMrowPtr)-=dimY; 

    rowPtr++; 
    otherMrowPtr++; 
} 

rowPtr = '\0'; 
otherMrowPtr = '\0'; 

otherM.value = '\0'; 

} 

matrix::matrix(int x, int y){ 

dimX = x; 
dimY = y; 
// allocate here 
value = new int*[dimX]; 
int** rowPtr = value; 
for(int i=0;i<dimX;i++){ 
    *rowPtr = new int[dimY]; 
    rowPtr++; 
} 
} 

matrix::~matrix(){ 
if(value!=NULL){ 
    int** rowPtr = value; 
    for(int i=0;i<dimX;i++){ 
      delete[] (*rowPtr); 
      rowPtr++; 
    } 
    rowPtr-=dimX; 
    delete[] rowPtr; 
    rowPtr = '\0'; 
} 
value = '\0'; 
} 
+0

クラスにはどのように 'value'が定義されていますか?そしてなぜ 'i'と' j'で数えればすべてのポインタ算術演算?はるかに単純なループのために 'rowPtr [i] [j]'を使うことができます。 –

+1

あなたのクラスに 'copy constructor'、'代入演算子 'と' destructor'を実装しましたか? – hochl

+0

int ** value;行列クラスのデータフィールドである2d intポインタです。ポインタを使った練習のために、私はポインターの増分を使って作業を選択しました。コピーコンストラクタや代入演算子はありません。 – tartar

答えて

1

クラスのコピーコンストラクタ、代入演算子、デストラクタを実装しましたか?そうでない場合は、リソースを管理しているのでgo and implement thoseです。

関連する問題