2012-04-07 90 views
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); 

问题是调用设置时,我得到一个堆损坏错误。 我在做什么错? (我的猜测是这是我访问他们的数组元素的方式)

+0

还请注意,您的默认构造函数调用数组'new'大小为0,该调用返回的指针是因为解引用它是未定义的行为实际上是无用的。 – jrok 2012-04-07 16:58:40

回答

2

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

+0

该死的,我完全错过了!谢谢! – user1233963 2012-04-07 16:59:39

+1

@ user1233963 - 如果出于某种原因希望保留该方法(基于1),则可以在计算解析数组元素的最终索引之前简单地减小x和y。我建议零基础,习惯它,并喜欢它。 – 2012-04-07 17:03:17

0

C++中的数组是0个碱基,这意味着如果您有一个数组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); 
0

什么是拨错的是你必须从0开始计数。如果你创建一个大小为n * n的数组,你可以访问元素达到(n-1)*(n-1)。你的例子创建一个大小为5 * 5 = 25的arry,并使用trys来访问元素25.但是24是数组包含的highes元素。

0

你的索引超出数组到内存这就是为什么你所得到的错误。

的问题是与索引。 C++中数组的索引从0开始,所以对于k(5)的声明,它会生成索引为0-4的5的数组,因此索引5不是有效的索引。您应该将您的支票更改为x> = _ n和y> = _ n,因为5的索引无效。