Итак, я пытаюсь создать функцию, которая «изменяет размер» массива-члена до нового размера, переданного в качестве аргумента. Под «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++.
Заранее благодарен!
Ваш член переменной 'size' не является точным после первого вызова этой функции. Я не могу определить, насколько он точен * до *. –
И теперь, когда вы изменили код, переменная 'size' вашего члена будет неправильной, если массив будет больше. –
Я стараюсь, чтобы размер отражал количество элементов, а не количество пятен памяти в массиве, поэтому он должен увеличиваться только при добавлении новых элементов. При этом проблема заключалась в размере, что вызывало проблему с итерацией через цикл for. – user2884505