2

我有以下课程:

template <typename T>
class matrix
{
private:
    int _n;
    T* array;
public:
    matrix(): _n(0) 
    {
        array = new T[_n * _n];
    }
    matrix(int n): _n(n)
    {
        if( n < 0 )
            throw "Invalid array size!";
        array = new T[_n * _n];
    }
    ~matrix()
    {
        delete[] array;
    }
    void Set(const int x, const int y,const T val)
    {
        if( ( x<0 || x>_n ) && ( y<0 || y>_n) )
            throw "Invalid index";
        array[x*_n + y] = val;
    }
    T& Get(const int x, const int y)
    {
        if( ( x<0 || x>_n ) && ( y<0 || y>_n) )
            throw "Invalid index";
        return array[x*_n + y];
    }
};

并以这种方式使用它:

matrix<int> k(5);
k.Set(5,5,6);
cout<<k.Get(5,5);

问题是调用 Set 时出现堆损坏错误。我究竟做错了什么?(我猜这是我访问它们数组元素的方式)

4

4 回答 4

2

可以在索引 0-4 处访问 5 元素数组。您将 5 传递给xand y,这会导致在访问array.

于 2012-04-07T16:53:47.003 回答
0

C++ 中的数组是 0-base,这意味着如果你有一个数组int x[5]x[5]则无效。

你的条件应该是if( ( x<0 || x>=_n ) && ( y<0 || y>=_n) )if( ( x<0 || x>=_n ) && ( y<0 || y>=_n) )

要设置最后一个元素,您需要

k.Set(4,4,6);

并打印它:

cout<<k.Get(4,4);
于 2012-04-07T16:54:49.543 回答
0

磨损的是你必须从 0 开始计数。如果你创建一个大小为 n*n 的数组,你可以将元素访问到 (n-1)*(n-1)。您的示例创建一个大小为 5*5=25 的数组并尝试访问元素 25。但是 24 是您数组包含的最高元素。

于 2012-04-07T16:55:17.847 回答
0

您正在将数组以外的索引索引到内存中,这就是您收到错误的原因。

问题在于索引。C++ 中数组的索引从 0 开始,因此对于您的 k(5) 声明,它会生成一个索引为 0-4 的 5 数组,因此索引 5 不是有效的有效索引。您应该将签入集更改为 x>=_n 和 y>=_n,因为 5 的索引无效。

于 2012-04-07T16:56:58.743 回答