|
67 / 5 / 3
Регистрация: 30.11.2015
Сообщений: 170
|
|
Массивы: Если размер массива неизвестен27.02.2016, 22:05. Показов 18267. Ответов 17
Метки нет (Все метки)
Здравствуйте уважаемые программисты! Объясните пожалуйста, как правильно(по стандартам С++) создавать массив, который в процессе работы программы будет расширяться, но заранее не известно на сколько? Т.е. какой именно размер указывать? К примеру может есть какой-то максимальный размер или всегда нужно учитывать особенности программы в которой используется массив и примерно выставлять?
0
|
|
| 27.02.2016, 22:05 | |
|
Ответы с готовыми решениями:
17
Ввод в массив, размер которого заранее неизвестен Как записать массив числовых данных в Excel, если размер массива заранее неизвестен
|
|
Неэпический
|
|
| 27.02.2016, 22:12 | |
|
1
|
|
|
67 / 5 / 3
Регистрация: 30.11.2015
Сообщений: 170
|
|
| 27.02.2016, 22:19 [ТС] | |
|
Но если я еще не проходил вектора, и мне нужно в программе реализовать такой массив? это первое, а второе по стандарту размер массива константа, хотя я сомневаюсь что у меня всегда она остается константой, да и вообще я не понимаю если по стандарту опять же размер массива константа, а часто приходиться низлогать ее если так можно выразиться...почему так? парадокс какой-то...типа необъяснимый потому-что просто так устроен компьютер, как к примеру некоторые вещи объясняются таким способом про нюансы в ассемблере?
0
|
|
|
67 / 5 / 3
Регистрация: 30.11.2015
Сообщений: 170
|
||
| 27.02.2016, 22:31 [ТС] | ||
0
|
||
|
67 / 5 / 3
Регистрация: 30.11.2015
Сообщений: 170
|
|
| 27.02.2016, 22:39 [ТС] | |
|
Я понял, ну-ладно, бывает)))
Добавлено через 3 минуты Может кто-то еще подскажет?
0
|
|
|
0 / 0 / 0
Регистрация: 14.02.2016
Сообщений: 30
|
|||||||
| 28.02.2016, 00:32 | |||||||
0
|
|||||||
|
14071 / 9289 / 1346
Регистрация: 21.01.2016
Сообщений: 34,850
|
||
| 28.02.2016, 07:22 | ||
std::vector не так уж и долго. Быстрее, чем вести переписку на форуме.
0
|
||
|
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
|
||||||||||||
| 28.02.2016, 09:37 | ||||||||||||
Сообщение было отмечено vikiroy как решение
Решение
2
|
||||||||||||
|
67 / 5 / 3
Регистрация: 30.11.2015
Сообщений: 170
|
||
| 28.02.2016, 13:36 [ТС] | ||
0
|
||
|
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
| 28.02.2016, 13:46 | |
|
0
|
|
|
67 / 5 / 3
Регистрация: 30.11.2015
Сообщений: 170
|
||
| 28.02.2016, 13:50 [ТС] | ||
0
|
||
|
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
||
| 28.02.2016, 13:57 | ||
|
А если из темы не усвоили, как выделять память под массив в рантайме... перечитайте.
0
|
||
|
67 / 5 / 3
Регистрация: 30.11.2015
Сообщений: 170
|
|||
| 28.02.2016, 14:03 [ТС] | |||
Добавлено через 2 минуты
0
|
|||
|
Неэпический
|
|||||||||||||||||||||
| 28.02.2016, 17:31 | |||||||||||||||||||||
Сообщение было отмечено vikiroy как решение
Решение
В данный момент нас интересует вариант №2. Ну что же, можно познакомиться и с динамическим выделением памяти. Итак, если Вашему приложению понадобилась динамическая память, то можно запросить себе еще некоторое количество памяти во время выполнения. При этом нужно внимательно следить за тем, чтобы не произошло утечки памяти. Дело в том, что то, что мы выделили динамически, мы должны сами же и освободить, когда оно нам больше не нужно. В C для выделения памяти есть функции malloc, calloc, realloc, но это в C. Эти функции ничего не знают о устройстве C++ и просто выделяют (точнее, просят у системы) "сырой" непрерывный кусок памяти заданного размера (в байтах), и возвращают при этом указатель на "нечто" (void*). Причем, если память выделить не удалось, то вернется "NULL". Для освобождения памяти используется функция free, она также ничего не знает о C++. В C++ для выделения такой же "сырой" памяти имеется operator new (и operator new[]). Отличие operator new от operator new[] - фактически в том, что можно более эффективнее реализовать собственные версии этих операторов. Так что всё, что сказано про operator new, относится и к operator new[]. Конечно, если где-то есть разница, я укажу. operator new так же запрашивает непрерывный кусок памяти, и возвращает указатель на "нечто" (void*). Никакие конструкторы эта штуковина тоже не вызывает, но уже знает о исключениях и если выделение зафейлится, то, кинет исключение, а не вернет nullptr. На самом деле, сначала еще попытает счастье с new_handler, но мы опустим этот момент. Также есть версия, которая не кидает исключение, а возвращает nullptr в случае неудачи и версия, которая совсем не выделяет память, а просто параметр-указатель проходит там "транзитом", причем можно еще и перегружать operator new, но сейчас не об этом. Для освобождения памяти, выделенной с помощью operator new используется operator delete. Для освобождения памяти, выделенной с помощью operator new[] используется operator delete[]. В C++ чаще для выделения памяти используется new-expression (не путать с operator new ).Имеются две версии new-expression - new и new[].Первая версия выделяет количество памяти, достаточное для хранения одного элемента заданного типа и применяет соответствующий тип инициализации, например, вызывает конструктор без параметров. Вторая версия выделяет количество памяти, достаточное для хранения переданного количества элементов заданного типа и применяет соответствующий тип инициализации, например, вызывает конструкторы без параметров. new-expression фактически работает в два этапа: 1) Запрашивает память, вызывая operator new (вторая версия вызывает operator new[]), причем количество байт рассчитывает самостоятельно, основываясь на размере типа и количестве необходимых элементов (для первой версии это один элемент). Плюс может приписать некоторое количество байт для собственных нужд, например, для хранения количества элементов под которые выделена память. 2) Затем производит инициализацию элемента (вторая версия производит инициализацию всех элементов). Если инициализатор не указан, то будет использована default-initialization, если указан - direct-initialization. Ситуацию, когда при инициализации вылетает исключение пока не будем рассматривать. Если из new-expression не вылетит исключение, то вернется указатель на выделенный кусок памяти, либо будет возвращен nullptr, если была использована версия operator new, которая не выкидывает исключение в случае неудачи. Для освобождения памяти, выделенной с помощью new-expression, используется delete-expression. delete-expression также имеет две версии: delete и delete[]Соответственно, для освобождения памяти, выделенной с помощью new используется delete,а для памяти, выделенной с помощью new[] - delete[]delete-expression фактически, также работает в два этапа: 1) Вызывает деструктор объекта (delete[] вызывает деструкторы объектов). 2) Освобождает память, вызывая operator delete (delete[] вызывает operator delete[]). Пока мы не освободим память, она так и будет считаться занятой. Важно! Если мы потеряем последний указатель на выделенную память, и более никак не сможем добраться до адреса, который вернула соответствующая функция выделения, то, соответственно, мы не сможем освободить эту память и она так и будет висеть занятой до самого конца работы приложения. То есть память эту мы не сможем использовать (т.к. у нас нет её адреса), но при этом она будет помечена как "занятая", т.е. будет бесполезная трата памяти. Такая ситуация называется "утечка памяти". И за этими утечками не так просто уследить, если использовать "голые" указатели. Напишем несколько примеров и посмотрим на результат:
Как видим, память выделилась, но конструкторы не вызывались. operator new тоже ничего не будет вызывать, а также выделит кусок памяти, поэтому пропустим его, перейдем сразу к new-expression:
как видим, помимо того, что произошло выделение памяти, также вызвались конструкторы объектов, а при уничтожении вызвались деструкторы.
В этом примере показано как можно "расширить" выделенный кусок памяти. Конечно, выделять память и копировать элементы при каждом чихе не очень эффективно, но это лишь пример. Например, std::vector работает по такому же принципу, только там память выделяется сразу с запасом и используется placement new для создания элементов (конечно, всё немного сложнее и вся эта фигня завернута в аллокатор). если нужно, могу подробнее описать, но не думаю, что на данном этапе обучения это будет очень понятно, собственно, поэтому и в этом посте содержатся некоторые допущения, и нет сложных примеров, а также placement new, перегрузок операторов new/delete и т.д.
11
|
|||||||||||||||||||||
|
67 / 5 / 3
Регистрация: 30.11.2015
Сообщений: 170
|
||
| 28.02.2016, 18:55 [ТС] | ||
|
Очень познавательно! Но если я буду разбираться сейчас с динамическим выделением памяти, мне надо будет все бросить и резко начинать учить указатели, а у меня тема указатели и строки, как раз будет после выполнения моих заданий.
Но ваш труд у меня останется несомненно! И я обязательно его изучу(пока что только просмотрел) когда придет время знакомства с динамическим выделением памяти! Спасибо вам большое! А пока я воспользуюсь вашим советом и на этом этапе ограничусь размером массива предусмотрительно большим чем он может быть, а именно
0
|
||
| 28.02.2016, 18:55 | |
|
Помогаю со студенческими работами здесь
18
Ошибка: размер в памяти неизвестен Как подключить файл, если адрес неизвестен? Как скопировать файл, если его путь неизвестен Использовать свойство базового типа если генерик тип неизвестен
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга,
Ты же видел моря и метели.
Как сменялись короны и стяги,
Как эпохи стрелою летели.
- Этот мир — это крылья и горы,
Снег и пламя, любовь и тревоги,
И бескрайние. . .
|
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1
У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\
А в самом низу файла-профиля. . .
|