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

Проблема в том, я получаю ошибку коррупции кучи при вызове Set. Что я делаю неправильно? (думаю, именно так я могу получить доступ к элементам массива)

+0

Обратите внимание, что ваш конструктор по умолчанию вызывает массив 'new' с размером 0. Указатель, возвращенный этим вызовом, практически бесполезен, так как разыменование является неопределенным поведением. – jrok

ответ

2

Доступ к массиву из 5 элементов можно получить с помощью индексов 0-4. Вы передаете 5 для x и y, что приводит к недопустимому индексу при доступе к array.

+0

Черт, я полностью пропустил это! Благодаря! – user1233963

+1

@ user1233963 - Если вы по какой-то причине хотите сохранить этот подход (на основе 1), вы можете просто уменьшить x и y, прежде чем вычислять окончательный индекс для решения элемента массива. Я бы рекомендовал основать ноль, привыкнуть к нему и полюбить его. –

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

Что такое worng является то, что вам должен начинать отсчет с 0. Если вы создадите массив размером n * n, вы можете получить доступ к элементу до (n-1) * (n-1). В вашем примере создайте массив размером 5 * 5 = 25 и попробуйте присоединиться к элементу 25. Однако 24 - это элемент highes, который вы используете в массиве.

0

Вы индексируете за пределами массива в память, поэтому вы получаете ошибку.

Проблема с индексированием. Индексирование массивов в C++ начинается с 0, поэтому для вашего объявления k (5) он создает массив из 5, который индексируется 0-4, поэтому индекс 5 не является допустимым действительным индексом. Вы должны изменить свой чек в качестве x> = _ n и y> = _ n, так как индекс 5 недействителен.