int *Array = new int [100]; // Создание массива
//...
Array = (int*) realloc (Array, 1000 * sizeof(int)); // Изменение размеров массива
//...
delete[] Array; // Удаление массива
Изменение размеров массива объектов
Как правильно изменить размер массива, выделяемого оператором new[]. Есть ли вообще такая возможность.
А то в следующем коде слышны громкие матюки CodeGuard'а в команде realloc
Код:
Что можно использовать вместо realloc? Есть ли возможность автоматического вызова деструкторов/конструкторов для объектов, угодивших под изменение кол-ва?
Код:
#include <vector>
using namespace std;
typedef vector <int> int_vector;
/* ... */
{
int_vector x(100);
/* ... */
x.resize(1000);
}
using namespace std;
typedef vector <int> int_vector;
/* ... */
{
int_vector x(100);
/* ... */
x.resize(1000);
}
И меня интересует работа оператора new
Например, я уже задавал схожий вопрос - здесь
Но ответа на него я не получил :(
Такой возможности нет.
Правильно делается так:
1. выделяется новый участок памяти нужного размера при помощи new
2. копируется туды содержимое старого массива
3. delete[] старый массив
4. указатель старого массива = указатель нового массива.
Код:
#include <string.h>
int main() {
int arr_sz = 100;
int *array = new int [arr_sz];
{
int new_arr_sz = 1000;
int *new_array = new int [new_arr_sz];
memcpy(new_array, array, sizeof(int) * arr_sz);
delete [] array;
array = new_array;
arr_sz = new_arr_sz;
}
return 0;
}
int main() {
int arr_sz = 100;
int *array = new int [arr_sz];
{
int new_arr_sz = 1000;
int *new_array = new int [new_arr_sz];
memcpy(new_array, array, sizeof(int) * arr_sz);
delete [] array;
array = new_array;
arr_sz = new_arr_sz;
}
return 0;
}
Кстати, вышеприведенный код работает только для "поверхностных типов", не требующих инициализации, таких как int, double и т.д., а также указателей. Объекты "глубоких типов" которые содержат в себе массивы, с точки зрения производительности лучше вообще не двигать с места на место, а оперировать лишь массивами указателей на такие "тяжелые" объекты.
Так для базовых типов проще использовать malloc/calloc-realloc-free - я бы и не спрашивал.
Меня интересуют именно объекты, имеющие конструкторы/деструкторы
Используй другие структуры данных вместо массива - списки например.)
Меня интересуют именно объекты, имеющие конструкторы/деструкторы[/QUOTE]
Посмотри реализацию std::vector. Весьма поучительное чтиво... :)
Меня интересуют именно объекты, имеющие конструкторы/деструкторы[/QUOTE]
Ну а конструкторы/деструкторы полюбому выполняются для каждого создаваемого объекта в массиве:
X *x = new() X[25];
проверь сам - конструктор выполниться по разу для каждого из 25 объектов. И деструктор тоже при выходе объекта из контекста.
И вообще переходи на new/delete, это гораздо удобнее.
Другое дело если у тебя массив классов которые содержат в себе объекты создаваемые после инициализации, то такие классы двигать может стать очень накладно. Их нет смысла держать в массивах. держи массив указателей на эти классы, или, как говорит Фрости, списки что ли...
вот именно, на мой взгляд это самое оптимальное решение
X *x = new() X[25];
проверь сам - конструктор выполниться по разу для каждого из 25 объектов. И деструктор тоже при выходе объекта из контекста.
И вообще переходи на new/delete, это гораздо удобнее.
[/QUOTE]
Перешёл - уже давно :D . Посему и спрашиваю: есть ли какой-нибудь оператор "renew" (аналогичный realloc) - да ну и аппетиты у меня :)
Цитата:
Другое дело если у тебя массив классов которые содержат в себе объекты создаваемые после инициализации, то такие классы двигать может стать очень накладно. Их нет смысла держать в массивах. держи массив указателей на эти классы, или, как говорит Фрости, списки что ли...
Смотря какие - например, AnsiString "двигать" очень даже не накладно - ведь этот объект имеет размер 4 байта - одно поле типа char*
А все же, чем не подходят стандартные контейнеры?
Ну допустим, Я, исключительно абстрактного любопытства ради, а не пользы дела для, решил сам сделать что-то, на "низком" уровне.
Как сказал Василй Васильевич Головачёв: "Источник нашей мудрости - наш опыт, источник нашего опыта - наша глупость" :D