几个月前我开始用 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(即使它针对同一矩阵的同一行和同一列)触发了断点,并且我在输出中收到一条错误消息,指出正在访问无效地址。我正在使用 App Verifier,它返回的调用堆栈位置没有源代码。如果我不将指针向量传递给函数,而是直接在 main 方法中访问它,它就可以正常工作。此外,如果我使用向量而不是矩阵运行相同的代码,它工作正常。我不认为 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 是矩阵的行数。如果一切都失败了,我只会将我的矩阵组合成一个矩阵并将其传递给函数,但我想了解为什么这不起作用。任何输入将不胜感激。