数か月前に C++ で書き始めましたが、ポインターの使用に問題があります。仕事のために書いてきたコードでは、私が書いた matrix_t クラスを使用していくつかの行列を定義しました。これらの行列へのポインタを含むベクトルを作成しました。行列にアクセスする関数にベクトルを渡します。これが私がやろうとしていることの簡単な例です:
#include <iostream>
#include "matrix_t.h"
using namespace std;
int mat_access (vector <matrix_t<int>*> &pmatrices)
{
matrix_t<int> mat = *pmatrices[0];
return mat.get_cell(0, 0);
/*get_cell(r, c) returns the value at row r, column c*/
}
int main()
{
vector <matrix_t<int>*> pmatrices(1);
matrix_t <int> mat (1, 1, 1);
/*mat_1(v, r, c) has r rows, c columns, and is filled with the value v*/
pmatrices[0] = &mat;
for (size_t i = 0; i < 5; i ++)
{
int k = mat_access(pmatrices);
cout << k;
}
}
デバッグ中に関数をステップ実行すると、関数 mat_access が初めて呼び出されたときに機能します。ただし、get_cell が 2 回目に呼び出されると (同じ行列の同じ行と列に対してであっても)、ブレークポイントがトリガーされ、無効なアドレスがアクセスされているというエラー メッセージが出力に表示されます。App Verifier を使用していますが、それが返すコール スタックの場所にソース コードがありません。ポインタのベクトルを関数に渡さず、代わりにメイン メソッドで直接アクセスすると、問題なく動作します。また、行列の代わりにベクトルを使用して同じコードを実行すると、正常に動作します。コード内の他のいくつかの場所で get_cell を使用しており、インデックスが正しいと確信しているため、これは get_cell の問題ではないと思います。matrix_t クラス内では次のようになります。
T get_cell (size_t row, size_t col) const
{ try
{
if (row >= n_rows || col >= n_cols)
throw myerror("Index out of bounds");
}
catch (exception &e)
{
cout << "Exception: " << e.what() << '\n';
}
return t_array [col * n_rows + row];
}
t_array には行列要素が含まれ、n_rows は行列の行数です。他のすべてが失敗した場合は、マトリックスを 1 つのマトリックスに結合して関数に渡しますが、これが機能しない理由を理解したいと思います。任意の入力をいただければ幸いです。