我有以下课程:
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时遇到堆损坏错误。 我究竟做错了什么? (我的猜测是我访问数组元素的方式)
答案 0 :(得分:2)
可以在索引0-4处访问5元素数组。您为x
和y
传递了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的索引无效。