Я искал много тем здесь, но они, кажется, не отвечали мне точно.
Я пытаюсь сделать некоторые динамические массивы od перераспределения в C ++. Я не могу использовать что-либо из библиотек STL, поскольку мне нужно использовать это в домашней работе, где STL (векторы, …) явно запрещены.
До сих пор я пытался разработать такой код:
int * items = new int[3]; //my original array I'm about to resize
int * temp = new int[10];
for (int i = 0; i < 3; i++) temp[i] = items[i];
delete [] items; //is this necessary to delete?
items = new int [10];
for (int i = 0; i < 10; i++) items[i] = temp[i];
delete [] temp;
Кажется, это работает, но меня беспокоит чрезмерное количество итераций. Разве это не может быть сделано в любом случае умнее? Очевидно, я работаю с гораздо большими массивами, чем этот. К сожалению, Я должен работать с массивами, хотя.
редактировать: Когда я пытаюсь сделать items = temp;
вместо
for (int i = 0; i < 10; i++) items[i] = temp[i];
и попытаться std::cout
все мои элементы, я теряю первые два элемента, но Valgrind печатает их правильно.
Да первый delete[]
является необходимым. Без этого вы бы потеряли память.
Что касается кода, который идет после этого первого delete[]
все это можно заменить на:
items = temp;
Это сделало бы items
укажите на массив из десяти элементов, который вы только что заполнили:
int * items = new int[3]; //my original array I'm about to resize
int * temp = new int[10];
for (int i = 0; i < 3; i++) temp[i] = items[i];
delete [] items; //delete the original array before overwriting the pointer
items = temp;
Наконец, не забудьте delete[] items;
когда вы закончите с массивом.
Контейнеры STL
были сделаны, чтобы облегчить работу, как это. Это утомительно, но нет большого выбора, когда вам нужно использовать C
-arrays.
Удаление
delete [] items;
необходимо, например, когда вы откажетесь от ссылки на массив, что вы сделали бы с назначением новой ссылки в
items = new int [10];
приведет к утечке памяти, так что это необходимо.