【发布时间】:2011-07-08 02:27:07
【问题描述】:
我的 C++ 应用程序出现错误,我无法调试。我在网上查看过,我似乎正在以正确的方式进行所有分配/解除分配。这是我的代码:
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
}
一旦变量“myMatrix”超出范围,我就会收到以下错误:
0x103159da (msvcr1000d.dll) 处的未处理异常...访问冲突读取位置 0xfeeefee2。
我被带到文件“dbgdel.cpp”
_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
请帮忙!
编辑:
好的,我忽略了提供一些信息。请看下面:
我还有一个名为“T Dot(Matrix)”的附加方法我还有两个名为“Columns()”和“Rows()”的方法,它们只是 _cols 和 _rows 的 getter。还有一个名为“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;
}
这会产生与上述相同的错误,但仅在调用“Dot()”函数时。
【问题讨论】:
-
你试过从你的主函数中删除 myMatrix.~Matrix() 吗?一旦对象超出范围,就会自动调用析构函数,您不应该显式调用它。
-
@Connman。谢谢,我知道析构函数是自动调用的,但我把它放在那里作为测试。我可以发誓即使我没有错误,我也会收到错误,但是现在我问了这个问题,它们当然已经消失了。我将尝试重现几个小时前的内容。
-
@Eric,如果您不使用它,请不要在您的问题中添加此类误导性代码。请参阅编辑后的答案。
标签: c++ arrays memory-management dynamic