Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 94, средняя оценка - 4.62
iFree
2 / 2 / 0
Регистрация: 11.10.2010
Сообщений: 35
18.02.2011, 19:26     Измерение размера динамического массива #1
Как можно изменять размер динамического массива? К примеру, сначала у меня:

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

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

Увелечение размера динамического массива C++
C++ Подскажите простую реализацию динамического массива и его использование с возможностью изменения его размера
C++ Функция изменения размера динамического массива
Динамическое увеличение размера динамического массива C++
C++ Изменение размера динамического массива (resize)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
18.02.2011, 19:35     Измерение размера динамического массива #2
использовать std::vector<>
в данном случае, ни определить размер массива, ни увеличить его невозможно

с помощью сишных функций malloc/free можно сделать realloc и увеличить массив, но со своими танцами и размера конечно никто не вернет
iFree
2 / 2 / 0
Регистрация: 11.10.2010
Сообщений: 35
18.02.2011, 19:46  [ТС]     Измерение размера динамического массива #3
Цитата Сообщение от alex_x_x Посмотреть сообщение
использовать std::vector<>
в данном случае, ни определить размер массива, ни увеличить его невозможно

с помощью сишных функций malloc/free можно сделать realloc и увеличить массив, но со своими танцами и размера конечно никто не вернет
А можно подробнее о векторе? Я еще очень неопытен в программировании.
Я рассматривал вариант realloc, но мне не нравится
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
18.02.2011, 19:48     Измерение размера динамического массива #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот вполне себе без темповой переменной в её обычном понимании - второй массив служит не для временного хранения, а фактически становится постоянным массивом и происходит лишь одно копирование. Недостаток - надо передавать не только новый размер, а ещё и старый, чтобы корректно скопировать. Но всё же надо использовать именно вектор, раз на плюсах пишете.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
 
template< typename T >
void my_realloc(T *&, size_t, size_t);
 
int main()
{
    int *arr = new int [10];
 
    for (size_t i = 0; i < 10; ++i)
        arr[i] = i;
 
    for (size_t i = 0; i < 10; ++i)
        std::cout << arr[i] << "  ";
 
    std::cout << std::endl;
 
    my_realloc(arr, 10, 15);
 
    for (size_t i = 10; i < 15; ++i)
        arr[i] = i;
 
    for (size_t i = 0; i < 15; ++i)
        std::cout << arr[i] << "  ";
    
    std::cout << std::endl;
 
    delete [] arr;
 
    return 0;
}
 
template< typename T >
void my_realloc(T *&arr, size_t size, size_t new_size)
{
    T *new_arr = new T [new_size];
    size = size < new_size ? size : new_size;
 
    for (size_t i = 0; i < size; ++i)
        new_arr[i] = arr[i];
 
    delete [] arr;
 
    arr = new_arr;
}
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
18.02.2011, 19:55     Измерение размера динамического массива #5
iFree, std::vector и библиотека stl
http://www.cplusplus.com/reference/stl/vector/
но разбираться надо капитально, хотя и крайне полезно

silent_1991 предложил вполне рабочий способ
но можно покритиковать с точки зрения, что активная работа с динамической памятью таким образом приводит к ее фрагментированию
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
18.02.2011, 20:06     Измерение размера динамического массива #6
Цитата Сообщение от alex_x_x Посмотреть сообщение
активная работа с динамической памятью таким образом приводит к ее фрагментированию
Разумеется))) Но этот способ является, вроде бы, единственным "ручным" способом подобных действий. Или ошибаюсь?

Не по теме:

Кстати, никто не в курсе, по какому такому провидению разработчики не включили в язык оператора перевыделения памяти? За что они нас так любят?

alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
18.02.2011, 20:52     Измерение размера динамического массива #7
Цитата Сообщение от silent_1991 Посмотреть сообщение
Но этот способ является, вроде бы, единственным "ручным" способом подобных действий.
так и есть

ну вот страуструп у себя в C++ Style and Technique кивает в сторону stl

If you want to, you can of course use realloc(). However, realloc() is only guaranteed to work on arrays allocated by malloc() (and similar functions) containing objects without user-defined copy constructors. Also, please remember that contrary to naive expectations, realloc() occasionally does copy its argument array.
In C++, a better way of dealing with reallocation is to use a standard library container, such as vector, and let it grow naturally.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
18.02.2011, 21:01     Измерение размера динамического массива #8
alex_x_x, ха. Т.е. они сознательно нас лишили вполне-таки полезной возможности перераспределения памяти (которое в некоторых случаях происходит без перемещения блока памяти, а именно с приращением при увеличении, а уж при уменьшении в большинстве случаев вообще копирования не происходит). Ну а если хочется мне велосипед изобрести? Нет, батенька, юзайте СТЛ)))
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
13.12.2012, 18:33     Измерение размера динамического массива #9
Цитата Сообщение от alex_x_x Посмотреть сообщение
в данном случае, ни определить размер массива, ни увеличить его невозможно
Так и запишем: realloc прочно забыт.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
13.12.2012, 18:49     Измерение размера динамического массива #10
Цитата Сообщение от taras atavin Посмотреть сообщение
Так и запишем: realloc прочно забыт.
так и запишем: тарас умеет отвечать только на первую строку поста
activnaya
 Аватар для activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
13.12.2012, 19:00     Измерение размера динамического массива #11
а что насчет того чтобы перераспределение было реализовано отдельным Сишным объектным модулем? Или к примеру собрать библиотеку с одной функцией из Си, и уже линковать с этой библиотекой?

Добавлено через 1 минуту
разве realloc принципиально лучше vector.resize()?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.12.2012, 19:16     Измерение размера динамического массива #12
Цитата Сообщение от activnaya Посмотреть сообщение
разве realloc принципиально лучше vector.resize()?
Дело больше в том, что realloc() может быть несовместим с operator new()

Не по теме:

Цитата Сообщение от silent_1991 Посмотреть сообщение
Кстати, никто не в курсе, по какому такому провидению разработчики не включили в язык оператора перевыделения памяти? За что они нас так любят?
Потому что до С++11 в языке не было move-семантики — однозначно работающего специализированного механизма для переноса объекта из одного места в другое. Не снятия копии и её присваивания, а именно переноса, ведь realloc() по идее должен именно переносить объект. А почему его не было — это другой вопрос. Наверное, потому что объекты в угоду совместимости с Си всё ещё считались значениями, а не объектами.

taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
13.12.2012, 19:16     Измерение размера динамического массива #13
Цитата Сообщение от activnaya Посмотреть сообщение
разве realloc принципиально лучше vector.resize()?
Какой вектор ресайз, если уже объявлен явный указатель? Сказано же:
в этой ситуации.
А realloc применим к явному, но не применим к завёрнутому в вектор.
activnaya
 Аватар для activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
13.12.2012, 19:38     Измерение размера динамического массива #14
taras atavin, в этой ситуации надо писать на Си. А если кто-то создал эту ситуацию, то это его личные проблемы. stl vector был задуман как альтернатива массивам, вот его и надо было использовать, чтобы таких казусов не возникало.
~OhMyGodSoLong~, а что с этими мыслями?
Цитата Сообщение от activnaya Посмотреть сообщение
а что насчет того чтобы перераспределение было реализовано отдельным Сишным объектным модулем? Или к примеру собрать библиотеку с одной функцией из Си, и уже линковать с этой библиотекой?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.12.2012, 19:42     Измерение размера динамического массива #15
А зачем? Из Си++ realloc() вполне себе доступен.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.12.2012, 21:01     Измерение размера динамического массива #16
Цитата Сообщение от activnaya Посмотреть сообщение
разве realloc принципиально лучше vector.resize()
Да, потому что в некоторых случаях реаллок реально расширяет выделенный кусок памяти. Ресайз же просто выделяет новый кусок память и копирует всё туда, а старую память удаляет. Итого, в плюсах нет стандартной возможности расширить выделенный ранее кусок памяти для не-POD типов (для подов всё ещё можно использовать тот же реаллок).
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
14.12.2012, 21:25     Измерение размера динамического массива #17
Если скорость не критична, то можно копировать текущий массив в резервный, потом освобождать память от текущего и создавать массив с новой памятью, копируя в него данные из резерва и добавляя нужные значения
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.12.2012, 21:28     Измерение размера динамического массива #18
daslex, оверхэд. Достаточно одного выделения памяти, как я продемонстрировал выше. Или выделения с запасом (на случай поэлементного добавления в конец, чтобы не перевыделять память каждый раз для одного элемента), как сделано, например, в той же stl.
activnaya
 Аватар для activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
14.12.2012, 21:55     Измерение размера динамического массива #19
Цитата Сообщение от silent_1991 Посмотреть сообщение
для подов всё ещё можно использовать тот же реаллок
в том числе и в случаях, когда память выделялась с помощью new(), а не malloc()?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2012, 22:01     Измерение размера динамического массива
Еще ссылки по теме:

C++ Double free or corruption при изменении размера динамического массива
Определение размера динамического массива строк C++
Изменение размера динамического массива объектов класса C++

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

Или воспользуйтесь поиском по форуму:
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
14.12.2012, 22:01     Измерение размера динамического массива #20
Цитата Сообщение от silent_1991 Посмотреть сообщение
Итого, в плюсах нет стандартной возможности расширить выделенный ранее кусок памяти для не-POD типов (для подов всё ещё можно использовать тот же реаллок).
Нет, ну вообще можно. Управлять памятью с помощью realloc() и вызывать конструкторы/деструкторы вручную. Но, опять же, работает не всегда (если realloc() таки перенесёт память, то объекты не в курсе, что их перенесли, так что всё поломается, если они хранят указатели друг на друга).

Если так уж напрягает полное копирование — связные списки в помощь. Их можно сделать достаточно быстро индексируемыми (unrolling, skip lists и т. п.)
Yandex
Объявления
14.12.2012, 22:01     Измерение размера динамического массива
Ответ Создать тему
Опции темы

Текущее время: 16:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru