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';
}
クラスにはどのように 'value'が定義されていますか?そしてなぜ 'i'と' j'で数えればすべてのポインタ算術演算?はるかに単純なループのために 'rowPtr [i] [j]'を使うことができます。 –
あなたのクラスに 'copy constructor'、'代入演算子 'と' destructor'を実装しましたか? – hochl
int ** value;行列クラスのデータフィールドである2d intポインタです。ポインタを使った練習のために、私はポインターの増分を使って作業を選択しました。コピーコンストラクタや代入演算子はありません。 – tartar