|
67 / 5 / 3
Регистрация: 30.11.2015
Сообщений: 170
|
|
Массивы: Если размер массива неизвестен27.02.2016, 22:05. Показов 18402. Ответов 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
|
|||||||
|
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,299
|
||
| 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
Ошибка: размер в памяти неизвестен Как подключить файл, если адрес неизвестен? Как скопировать файл, если его путь неизвестен Использовать свойство базового типа если генерик тип неизвестен
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2).
Унарный минус обозначается как !
*/
#include <iostream>
#include <stack>
#include <cctype>. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|