2012-06-14 4 views
1

У меня есть следующий метод:C++ данные изменения без видимой причины

void Polygon::expand() { 
    int newSize = max * 2; 
    printArray(array, current); 
    Point* newArray = new Point[newSize]; 
    printArray(array, current); 
    for (int i = 0; i <= current; i++) { 
      newArray[i] = array[i]; 
    } 
    delete[] this->array; 
    array = newArray; 
    max = newSize; 
} 

printArray для отладки и также очень прост:

void printArray(Point* array, int size) { 
    cout << "array\n==========" << endl; 
    for (int i=0; i<=size; i++) { 
      cout << array[i] << ": " << array[i].getX() << ", " << array[i].getY() << endl; 
    } 
} 

Метод пытается расширить массив, который член класса типа Point*. Странная вещь печатает я получаю при запуске этого:

массив
==========
(0,0): 0, 0
(1,1): 1, 1
(2,2): 2, 2
(3,3): 3, 3
массив
==========
(0,0): 0, 0
(1,1): 1, 1
(2,2): 2, 2
(3,5.58294e-322): 3, 5.58294e-322

По какой-то причине последний Point в изменении массива, даже если я не прикоснулся между отпечатками! Любая идея о том, что может это сделать?

ответ

7

Когда вы начинаете индексирование с 0 (как на C и C++), вы останавливаете на один меньше, чем size. Итак, do:

for (int i=0; i<size; i++) // not <= 

Это классическая ошибка «один за другим» (и вы вызываете UB).

+0

Я не вижу, как это может быть причиной того, что вы должны печатать разные точки, даже если я отключен одним. –

+0

Когда вы вызываете UB, как и у вас, более одного раза, вы не можете ожидать каких-либо нормальных результатов. Исправьте свой код, а затем дайте ему еще один снимок. Помните, что мы даже не знаем, что такое 'getX',' getY'. Поэтому я предлагаю вам проверить их тоже. – dirkgently

+0

В этом случае 'current' хранится как самый большой индекс, а не фактический размер. –

Смежные вопросы