gpt4 book ai didi

c++ - 使用模板取消分配动态二维数组

转载 作者:搜寻专家 更新时间:2023-10-31 00:20:08 24 4
gpt4 key购买 nike

我在我的 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,因此当变量超出范围时将自动调用 dtor,即当 main() 返回时。

关于c++ - 使用模板取消分配动态二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6619345/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com