|
4 / 4 / 5
Регистрация: 28.04.2010
Сообщений: 162
|
|||||||||||
Отличие операции с выделением памяти и без09.08.2011, 16:05. Показов 6146. Ответов 60
Метки нет (Все метки)
Всем привет!
Не сочтите за глупость, но возник интересный вопрос, над которым давно думаю, а овтета нигде не находил Вот нужно, допустим, создать массив из n элементов Сделать это можно 2-мя способами
и
В чём принципиальная разница? Я понимаю, в Qt сразу написано - объекты QObject необходимо создавать с выделением памяти, чтобы не было проблем Понятно, так и делаем. А тут как правильней?
0
|
|||||||||||
| 09.08.2011, 16:05 | |
|
Ответы с готовыми решениями:
60
Ошибка с выделением памяти Конструктор с выделением памяти |
|
|
|||
| 09.08.2011, 16:10 | |||
|
2
|
|||
|
12 / 12 / 1
Регистрация: 09.08.2011
Сообщений: 53
|
|
| 09.08.2011, 16:13 | |
|
Разница также состоит в том, что используя динамическое распределение памяти, вы должны сами явно вписывать уничтожение (освобождение) памяти под этим динамическим объектом, иначе можно получить нечто неконтролируемо пожирающее память..
0
|
|
|
Заблокирован
|
|
| 09.08.2011, 16:16 | |
|
в стеке память быстрее выделится
0
|
|
|
Заблокирован
|
|||||||
| 09.08.2011, 16:25 | |||||||
Вопрос только в том, где и как выделяется память.В первом случае у вас выделяется память в стеке, во втором случае у вас память выделяется в кучи. Но главное, о чем здесь не упомянули, эти два опреде6ления объявляют два разных типа данных! В первом случае вы действительно определяете массив, а во-втором случае вы определяете указатель. В С++ особенно существенна разница между указателями и массивами, так как sizeof массива отличается от sizeof указателя. И кроме того в С++ могут быть определены функции, аргументами которых являются ссылки на массив. То есть в С++ можно в функции в качестве параметра передавать массивы. Посмотрите пример шаблонной функции
2
|
|||||||
|
|
|||||||||||||
| 09.08.2011, 16:33 | |||||||||||||
0
|
|||||||||||||
|
Заблокирован
|
||
| 09.08.2011, 16:35 | ||
|
0
|
||
|
Freelance
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
|
|
| 09.08.2011, 16:36 | |
|
1
|
|
|
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
|
|||||||
| 09.08.2011, 16:37 | |||||||
0
|
|||||||
|
Заблокирован
|
||
| 09.08.2011, 16:45 | ||
|
Добавлено через 7 минут Кстати сказать, когда выделяется память в куче для двумерного массива, многие программисты затем испытывают трудности при работе с ним, потому что не знают, как затем обращаться с этим массивом, и как определить указатель на выделенную память. Например, как правильно задать указатель для выделения памяти выражением вида new char[m][n]; Здесь уже был такой вопрос на форуме.
1
|
||
|
|
||||||||||||
| 09.08.2011, 16:51 | ||||||||||||
0
|
||||||||||||
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
||
| 09.08.2011, 16:54 | ||
|
1. Массив можно определить не только как локальный, но и как глобальный. Только для локального массива память выделяется в стеке во время работы программы. Для глобального массива память распределяет компилятор и эта память в стандарте называется static storage. Там же размещаются и статические переменные, даже локальные. Нестатические локальные переменные размещаются в автоматической памяти (automation - если не наврал - storage). Стандарт не говорит, что должен быть именно стек. Просто издревле локальные переменные размещались в стеке ВО ВРЕМЯ ВЫПОНЕНИЯ программы. Размещение в стеке массива сразу ограничивает его размер до размера стека, выделяемого по умолчанию операционной системой для программы. Размер можно увеличить, но это надо уже устанавливать режимы линкера. Размер массива должен быть константным выражением. 2. Во втором случае, как сказал Сыроежка, мы имеем указатель, который проинициализирован адресом первого элемента массива. Причем это делается тоже ВО ВРЕМЯ ВЫПОЛНЕНИЯ программы. Отличие от первого случая - это vds делаем сами, ручками, явными операциями. В первом случае массив автоматом уничтожается, а во втором случае мы должны его убить явно сами операцией delete[]. Размер массива может вычисляться во время работы программы. Подобный массив размещается в динамической памяти (это третий вид памяти для объектов в С++ - dynamic storage). Опять же, как реализовать эту память стандарт не оговаривает. 3. Шаблонная функция, которую написал Сыроежка - это к памяти вообще отношения не имеет. N - это параметр шаблона, который должен быть вычислен на этапе компиляции при инстанцировании шаблона и поставлен в текст функции.
0
|
||
|
Заблокирован
|
|||||||
| 09.08.2011, 16:54 | |||||||
0
|
|||||||
|
Freelance
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
|
||
| 09.08.2011, 16:55 | ||
|
1
|
||
|
|
|
| 09.08.2011, 16:57 | |
|
За указатель писал к тому что юзая функции мы всё равно в них указатели передаём, ну а на счёт sizeof - я предпочитаю этот дедовский способ, мне он интуитивно понятней...
На счёт передачи в sizeof динамики - вернётся 4
0
|
|
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
||
| 09.08.2011, 16:58 | ||
|
1
|
||
|
Заблокирован
|
||
| 09.08.2011, 17:00 | ||
|
Как-то странно звучит, что в С++ нет двумерных массивов, а в С они есть. Что-то неладно в королевском царстве!
0
|
||
| 09.08.2011, 17:00 | |
|
Помогаю со студенческими работами здесь
20
Проблема с выделением памяти Проблема с выделением памяти Ошибка с выделением памяти Проблемы с выделением памяти Ошибка в коде с выделением памяти Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
|
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс.
Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
|
Программный отбор элементов справочника 1С по перечислениям
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа.
В качестве фильтра для отбора служит предопределенное значение перечислений.
Процедура. . .
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|