Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Изменение размеров массива объектов

309
06 октября 2006 года
el scorpio
1.1K / / 19.09.2006
Вопрос из области чистой теоретики -возможно, несколько провокационный - как раз для Толкователей Стандарта C++;)

Как правильно изменить размер массива, выделяемого оператором new[]. Есть ли вообще такая возможность.

А то в следующем коде слышны громкие матюки CodeGuard'а в команде realloc
 
Код:
int *Array = new int [100]; // Создание массива
//...
Array = (int*) realloc (Array, 1000 * sizeof(int)); // Изменение размеров массива
//...
delete[] Array; // Удаление массива

Что можно использовать вместо realloc? Есть ли возможность автоматического вызова деструкторов/конструкторов для объектов, угодивших под изменение кол-ва?
294
06 октября 2006 года
Plisteron
982 / / 29.08.2003
Можно примерно так:
 
Код:
#include <vector>
using namespace std;

typedef vector <int> int_vector;
/* ... */
{
    int_vector x(100);
    /* ... */
    x.resize(1000);
}
309
06 октября 2006 года
el scorpio
1.1K / / 19.09.2006
Как бы это сказать, меня не интересуют векторы и прочие стандартные классы. Просто может возникнуть необходимость ручного создания массива объектов с возможностью изменения коллекции.
И меня интересует работа оператора new
Например, я уже задавал схожий вопрос - здесь
Но ответа на него я не получил :(
5.4K
06 октября 2006 года
Svyatozar
221 / / 11.09.2006
[QUOTE=el scorpio]Как правильно изменить размер массива, выделяемого оператором new[]. Есть ли вообще такая возможность.[/QUOTE]
Такой возможности нет.

Правильно делается так:
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;
}
5.4K
06 октября 2006 года
Svyatozar
221 / / 11.09.2006
Кстати, вышеприведенный код работает только для "поверхностных типов", не требующих инициализации, таких как int, double и т.д., а также указателей. Объекты "глубоких типов" которые содержат в себе массивы, с точки зрения производительности лучше вообще не двигать с места на место, а оперировать лишь массивами указателей на такие "тяжелые" объекты.
309
06 октября 2006 года
el scorpio
1.1K / / 19.09.2006
[QUOTE=Svyatozar]Кстати, вышеприведенный код работает только для "поверхностных типов", не требующих инициализации, таких как int, double и т.д., а также указателей. Объекты "глубоких типов" которые содержат в себе массивы, с точки зрения производительности лучше вообще не двигать с места на место, а оперировать лишь массивами указателей на такие "тяжелые" объекты.[/QUOTE]
Так для базовых типов проще использовать malloc/calloc-realloc-free - я бы и не спрашивал.
Меня интересуют именно объекты, имеющие конструкторы/деструкторы
1.9K
06 октября 2006 года
[*]Frosty
278 / / 17.06.2006
Используй другие структуры данных вместо массива - списки например.)
3
06 октября 2006 года
Green
4.8K / / 20.01.2000
[QUOTE=el scorpio]
Меня интересуют именно объекты, имеющие конструкторы/деструкторы[/QUOTE]
Посмотри реализацию std::vector. Весьма поучительное чтиво... :)
5.4K
06 октября 2006 года
Svyatozar
221 / / 11.09.2006
[QUOTE=el scorpio]Так для базовых типов проще использовать malloc/calloc-realloc-free - я бы и не спрашивал.
Меня интересуют именно объекты, имеющие конструкторы/деструкторы[/QUOTE]
Ну а конструкторы/деструкторы полюбому выполняются для каждого создаваемого объекта в массиве:

X *x = new() X[25];
проверь сам - конструктор выполниться по разу для каждого из 25 объектов. И деструктор тоже при выходе объекта из контекста.

И вообще переходи на new/delete, это гораздо удобнее.

Другое дело если у тебя массив классов которые содержат в себе объекты создаваемые после инициализации, то такие классы двигать может стать очень накладно. Их нет смысла держать в массивах. держи массив указателей на эти классы, или, как говорит Фрости, списки что ли...
16K
06 октября 2006 года
Deeoni$
21 / / 09.06.2006
[QUOTE=Svyatozar]держи массив указателей на эти классы, или, как говорит Фрости, списки что ли...[/QUOTE]
вот именно, на мой взгляд это самое оптимальное решение
309
07 октября 2006 года
el scorpio
1.1K / / 19.09.2006
[QUOTE=Svyatozar]Ну а конструкторы/деструкторы полюбому выполняются для каждого создаваемого объекта в массиве:

X *x = new() X[25];
проверь сам - конструктор выполниться по разу для каждого из 25 объектов. И деструктор тоже при выходе объекта из контекста.

И вообще переходи на new/delete, это гораздо удобнее.
[/QUOTE]
Перешёл - уже давно :D . Посему и спрашиваю: есть ли какой-нибудь оператор "renew" (аналогичный realloc) - да ну и аппетиты у меня :)
Цитата:

Другое дело если у тебя массив классов которые содержат в себе объекты создаваемые после инициализации, то такие классы двигать может стать очень накладно. Их нет смысла держать в массивах. держи массив указателей на эти классы, или, как говорит Фрости, списки что ли...


Смотря какие - например, AnsiString "двигать" очень даже не накладно - ведь этот объект имеет размер 4 байта - одно поле типа char*

3
07 октября 2006 года
Green
4.8K / / 20.01.2000
А все же, чем не подходят стандартные контейнеры?
309
07 октября 2006 года
el scorpio
1.1K / / 19.09.2006
[QUOTE=Green]А все же, чем не подходят стандартные контейнеры?[/QUOTE]
Ну допустим, Я, исключительно абстрактного любопытства ради, а не пользы дела для, решил сам сделать что-то, на "низком" уровне.

Как сказал Василй Васильевич Головачёв: "Источник нашей мудрости - наш опыт, источник нашего опыта - наша глупость" :D
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог