С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 94, средняя оценка - 4.62
iFree
2 / 2 / 0
Регистрация: 11.10.2010
Сообщений: 35
#1

Измерение размера динамического массива - C++

18.02.2011, 19:26. Просмотров 14885. Ответов 20
Метки нет (Все метки)

Как можно изменять размер динамического массива? К примеру, сначала у меня:

<имя_класса> *mas=new <имя_класса>[10];
.....
Ну и в процессе выполнения кода ВДРУГ понадобилось увеличить еще на несколько.
Как это сделать без буферной переменной?
Буферная переменная - это хорошо, если объекты занимают маленькое количество памяти.
Но мне нужно именно просто еще "довыделить" память для этого же массива.

Посоветуйте.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2011, 19:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Измерение размера динамического массива (C++):

Увелечение размера динамического массива - C++
Добрый день! Итак, допустим есть массив: char *str = new char; Задача следующая: увеличить размер массива на 1 (то есть до 5...

Определение размера динамического массива - C++
Вопрос может не много глупый, но я подзабыл с. Считаю размер динамического массива и результат получается неверный, логическую ошибку...

Изменение размера динамического массива - C++
вводится числовой массив неизвестной длинны, каждое число заносится в динамический массив. using namespace std; int main() { ...

Изменение размера динамического массива (resize) - C++
Учусь менять размер динамического массива. Помогите разобраться, пожалуйста. Допустим, есть какая-то структура &quot;читатель библиотеки&quot;. Моя...

Функция изменения размера динамического массива - C++
Здравия желаю, Друзья. Застрял вот на чем: #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; void Func(int *ar,...

Определение размера динамического массива строк - C++
Здравствуйте, столкнулся с проблемой предопределения размера массива строк. Проблема в том, что я не знаю, какой размер мне выделить при...

20
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
14.12.2012, 21:01 #16
Цитата Сообщение от activnaya Посмотреть сообщение
разве realloc принципиально лучше vector.resize()
Да, потому что в некоторых случаях реаллок реально расширяет выделенный кусок памяти. Ресайз же просто выделяет новый кусок память и копирует всё туда, а старую память удаляет. Итого, в плюсах нет стандартной возможности расширить выделенный ранее кусок памяти для не-POD типов (для подов всё ещё можно использовать тот же реаллок).
0
daslex
1286 / 530 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
14.12.2012, 21:25 #17
Если скорость не критична, то можно копировать текущий массив в резервный, потом освобождать память от текущего и создавать массив с новой памятью, копируя в него данные из резерва и добавляя нужные значения
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
14.12.2012, 21:28 #18
daslex, оверхэд. Достаточно одного выделения памяти, как я продемонстрировал выше. Или выделения с запасом (на случай поэлементного добавления в конец, чтобы не перевыделять память каждый раз для одного элемента), как сделано, например, в той же stl.
1
activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
14.12.2012, 21:55 #19
Цитата Сообщение от silent_1991 Посмотреть сообщение
для подов всё ещё можно использовать тот же реаллок
в том числе и в случаях, когда память выделялась с помощью new(), а не malloc()?
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
14.12.2012, 22:01 #20
Цитата Сообщение от silent_1991 Посмотреть сообщение
Итого, в плюсах нет стандартной возможности расширить выделенный ранее кусок памяти для не-POD типов (для подов всё ещё можно использовать тот же реаллок).
Нет, ну вообще можно. Управлять памятью с помощью realloc() и вызывать конструкторы/деструкторы вручную. Но, опять же, работает не всегда (если realloc() таки перенесёт память, то объекты не в курсе, что их перенесли, так что всё поломается, если они хранят указатели друг на друга).

Если так уж напрягает полное копирование — связные списки в помощь. Их можно сделать достаточно быстро индексируемыми (unrolling, skip lists и т. п.)
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
14.12.2012, 22:04 #21
~OhMyGodSoLong~, тогда уж лучше свой аллокатор написать...
Цитата Сообщение от activnaya Посмотреть сообщение
в том числе и в случаях, когда память выделялась с помощью new(), а не malloc()?
Нет, конечно, только если память выделялась одной из Xalloc-функций.
0
14.12.2012, 22:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2012, 22:04
Привет! Вот еще темы с ответами:

Динамическое увеличение размера динамического массива - C++
Никак не могу понять как это исправить.. Помогите, пожалуйста, разобраться в чём дело: struct myPoint ...

Изменение размера динамического массива объектов класса - C++
Всех приветствую! Нужно изменить размер динамического массива, в котором я храню созданные объекты. Делаю это так: Car *spis_temp =...

Double free or corruption при изменении размера динамического массива - C++
Сразу скажу, что у меня задание на работу с памятью, и std::vector по условию использовать запрещено. #include &lt;iostream&gt; #include...

Можно ли использовать memcpy для увеличения размера динамического массива? - C++
char *x = &quot;asdsadasdasdasdasdasdasdasdasd&quot;; char *t = new char; memcpy(t, x, 12); t = '\0'; printf(&quot;%s&quot;, t);Компилятор не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.