2015-01-26 5 views
0

Итак, я пытаюсь создать функцию, которая «изменяет размер» массива-члена до нового размера, переданного в качестве аргумента. Под «resize» я подразумеваю, что он должен установить массив элементов в новый массив с новым размером, скопировать элементы из старого массива и затем освободить память, связанную со старым массивом. Вот что у меня есть до сих пор:Нарушение прав доступа, когда массив «resizing» в C++

void MemoryTest::resize(unsigned int new_size) { 
    if (size == new_size) 
     return; 

    int* oldPtr = elements; 

    elements = new int[new_size + 1]; 
    for (int i = 0; i < (new_size < size) ? new_size : size; i++) 
     elements[i] = oldPtr[i]; 

    elements[new_size] = '\0'; 

    if (size > new_size) 
     size = new_size; 

    delete[] oldPtr; // Deallocate old elements array 
} 

Элементы - это частный член int *, инициализированный NULL.

Однако, когда он начинает цикл for, программа зависает некоторое время, прежде чем давать Нарушение доступа для элементов [i] = oldPtr [i]. Кто-то, пожалуйста, поправьте меня, если я ошибаюсь (что, вероятно, я), но я понимаю, что oldPtr должен быть указателем, указывающим на ту же начальную точку, что и элементы. Затем я устанавливаю элементы, равные новому массиву, поэтому они теперь указывают на две разные вещи. Затем я повторяю элементы, устанавливая каждый элемент равным его аналогу в старом массиве.

Кроме того, в то время как я обычно использовал вектор, чтобы избежать подобных ситуаций, я пытаюсь лучше ознакомиться с указателями и распределением памяти на C++.

Заранее благодарен!

+1

Ваш член переменной 'size' не является точным после первого вызова этой функции. Я не могу определить, насколько он точен * до *. –

+0

И теперь, когда вы изменили код, переменная 'size' вашего члена будет неправильной, если массив будет больше. –

+0

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

ответ

3

for (int i = 0; i < (new_size < size) ? new_size : size; i++)

следует читать

for (int i = 0; (i < (new_size < size)) ? new_size : size; i++)

Так, for (int i = 0; i < ((new_size < size) ? new_size : size); i++) должен исправить код.

+0

Почему не просто простой 'for (int i = 0; i PaulMcKenzie

+0

@PaulMcKenzie, что может быть слишком много итераций для нового массива. –

+0

@DrewDormann - Конечно, я предполагаю, что 'size' остается неизменным до тех пор, пока не будут завершены все синаниганы динамической памяти, а в конце функции' size' будет правильно установлен на новый размер. – PaulMcKenzie