动态数组堆损坏

时间:2012-04-07 16:50:23

标签: c++ dynamic heap corruption

我有以下课程:

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 个答案:

答案 0 :(得分:2)

可以在索引0-4处访问5元素数组。您为xy传递了5,这在访问array时会导致索引无效。

答案 1 :(得分: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);

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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