int* arr = new int[30];
int* newArr = new int[30];
arr[15] = 5;
newArr[15] = 9;
arr = newArr;
delete[] newArr;
Последняя строка освободит newArr, тем самым освободив обр.
Не совсем. newArr
и arr
- это просто имена, которые указывают на блоки памяти. Вы действительно не «бесплатно newArr», вы освобождаете блок памяти, на который он указывает сейчас. Который в тот момент оказывается тем же самым блоком, который на данный момент указывает arr
.
Но что случилось с блоком памяти, который содержал 5?
Он по-прежнему отмечен как использованный, но ничто в вашей программе никогда не сможет указать на него снова. Единственный указатель, который вам когда-либо был, был arr
, но затем вы назначили arr
чему-то еще.
Неужели это утечка памяти, к которой никогда нельзя получить доступ?
Точно.
Если да, то как я должен идти о том, чтобы убедиться, что эта память никогда не может быть утечка, и в то же время успешно переназначение исходный массив?
Забудьте обо всем этом динамическом массиве бессмысленности и используйте std::vector
.
std::vector<int> arr(30);
std::vector<int> newArr(30);
arr[15] = 5;
newArr[15] = 9;
arr = newArr;
_ "тем самым также освобождая arr" _ Huh ?? –
@ πάνταῥεῖ arr и newArr указывают на одно и то же, так что я ошибаюсь, говоря, что я освобождаю их обоих с помощью 'delete [] newArr'? –
Освобождение от одной и той же вещи? Что это значит? – juanchopanza