私のC++アプリケーションで、デバッグに問題があるとのエラーが発生しています。私はオンラインで見ましたが、私は割り当て/割り当て解除のすべてを正しい方法でやっているようです。ここに私のコードです:テンプレートを使用したダイナミック2D配列の割り当て解除
未処理の例外:とすぐに、変数「myMatrix」として
template <typename T>
class Matrix
{
private:
int _rows;
int _cols;
T** _matrix;
public:
Matrix(int r, int c);
~Matrix();
T GetValue(int r, int c);
};
template <typename T>
Matrix<T>::Matrix(int r, int c)
{
_rows = r;
_cols = c;
_matrix = new T*[_rows];
for(int i = 0; i < _rows; i++)
_matrix[i] = new T[_cols];
for(int i = 0; i < _rows; i++)
for(int j = 0; j < _cols; j++)
_matrix[i][j] = NULL;
}
template <typename T>
Matrix<T>::~Matrix()
{
for(int i = 0; i < _rows; i++)
delete [] _matrix[i];
delete [] _matrix;
}
template <typename T>
T Matrix<T>::GetValue(int r, int c)
{
if(r < 0 || r >= _rows || c < 0 || c > _cols)
{
throw -1;
return NULL;
}
return _matrix[r][c];
}
そして、私のクライアントコード...
int main()
{
Matrix<int> myMatrix(3, 3);
myMatrix.GetValue(1, 1);
// myMatrix.~Matrix(); // Don't do this anymore
}
スコープの外に出る、私はこのエラーを取得します0x103159da(msvcr1000d.dll)...アクセス違反は、場所0xfeeefee2を読み取っています。
そして、 "dbgdel.cpp"ファイルに持ち込まれました。 _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse));
助けてください!
EDIT:
さて、私はいくつかの情報を提供することを怠っ。以下を参照してください:
私は「Tドット(マトリックス)」と呼ばれる追加のメソッドを持っています。また、_colsと_rowsのgetterである2つのメソッド「Columns()」と「Rows()」があります。また、 "SetValue(int r、int c、T value)"というメソッドは_matrix[r][c] = value
と設定します。私はこれらのために実装が必要であるとは思わない。
template <typename T>
T Matrix<T>::Dot(Matrix<T> m)
{
if(_cols > 1 || m.Columns() > 1 || _rows != m.Rows())
{
throw -1;
return NULL;
}
T value = 0;
for(int i = 0; i < _rows; i++)
{
value += _matrix[i][0] * m.GetValue(i, 0);
}
return value; // Whoops, this was here, just forgot to type it
}
とクライアント...
int main()
{
Matrix<int> intM1(3, 1);
Matrix<int> intM2(3, 1);
intM1.SetValue(0, 0, 1);
intM1.SetValue(1, 0, 1);
intM1.SetValue(2, 0, 1);
intM2.SetValue(0, 0, 1);
intM2.SetValue(1, 0, 1);
intM2.SetValue(2, 0, 1);
std::cout << intM1.Dot(intM2) << endl;
}
これは上記と同じエラーが発生しますが、 "ドット()" 関数が呼び出されたときにのみ。
あなたのメイン関数からmyMatrix。〜Matrix()を削除しようとしましたか?デストラクターは、オブジェクトがスコープから外れると自動的に呼び出されます。オブジェクトを明示的に呼び出すべきではありません。 – Connman
@コーンマン。ありがとう、私はデストラクタが自動的に呼び出されたことを知っていたが、私はそこにテストとして入れた。私は、私がそこにそれを持っていなくてもエラーを受けていたと誓っていたかもしれませんが、もちろん私はこの質問をしたので、彼らは姿を消しました。私は数時間前のことを再現しようとしています。 – Eric
@エリックあなたがそれを使用していない場合は、そのような誤解を招くようなコードをあなたの質問に入れないでください。編集された答えを参照してください。 – iammilind