|
24 / 24 / 8
Регистрация: 02.02.2016
Сообщений: 135
|
|
Динамический массив new и его структура выделения памяти?24.04.2016, 23:58. Показов 6242. Ответов 43
Метки нет (Все метки)
Доброго времени суток, форумчане!
Долго искал возможность определения размера динамического массива выделенного new (sizeof конечно для указателя не работает). Все в один голос утверждают - это невозможно! Я могу конечно хранить где-то размерности своих массивов и потом искать их. Но чистоты эксперимента ради, есть такая загадка - delete [] Он то определяет размер выделенного массива по указателю. И ПРАВИЛЬНО определяет! (И почему раньше никто не доказывал этой теоремы от противного?) Вопрос к знатокам: Как он это делает? Или пошлите меня по FAQу URLом. PS Догадываюсь, что хранится эта служебная информация где-то в памяти. Но каков ее формат и точное местоположение?
0
|
|
| 24.04.2016, 23:58 | |
|
Ответы с готовыми решениями:
43
Структура и динамический массив
|
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
| 26.04.2016, 08:10 | |
|
0
|
|
|
Комп_Оратор)
|
||
| 26.04.2016, 09:08 | ||
|
А вот момент увеличения указателя, действительно, интересен тем, что если RTTI не использовать (это нужно один раз и для самого первого объекта, так как мы выяснили, что в перемежку базовый и наследник быть не могут) то из-за того, что размеры у базового и наследника, в общем случае, разные будет неприятность. Ну что-же... и опять спасибо TheCalligrapher, за ценную информацию. Получается, что нельзя обобщать выделение new и new[] из-за непереносимости.
0
|
||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
| 26.04.2016, 10:34 | |
|
IGPIGP, а мне еще доси режит слух, что
delete[] не вызовет виртуальные деструктора - хотелось бы цитаты с стандарта и почему никто с КО не пишит об этом в книгах - а тут бац и TheCalligrapher переворачивает жизнь. Странно как-то всё - мб там фраза "реализация лежит на компиляторах", а не UB
0
|
|
|
|
|||||||||||||
| 26.04.2016, 11:11 | |||||||||||||
|
Я попробую объяснить то, о чем говорит TheCalligrapher из несколько другого угла. Есть раздел в стандарте описывающий выражение delete
1)
2)
5
|
|||||||||||||
|
Комп_Оратор)
|
||
| 26.04.2016, 11:24 | ||
1
|
||
| 26.04.2016, 11:29 | |
|
0
|
|
|
|
||
| 26.04.2016, 11:37 | ||
|
2
|
||
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
||
| 26.04.2016, 11:58 | ||
|
1
|
||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||
| 26.04.2016, 16:56 | ||
|
Деструктор второого объекта это (адресс на первый + sizeof( std::size_t) * итератор)->__vfptr[индекс вирт метода]
1
|
||
|
Комп_Оратор)
|
||
| 26.04.2016, 17:01 | ||
1
|
||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
| 26.04.2016, 17:11 | |
|
0
|
|
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,413
|
||||||||
| 26.04.2016, 21:16 | ||||||||
|
С этим, кстати, был связан один известный баг в старом-добром VC 6.0. Язык С++ разрешает выделять массивы нулевого размера через new []
delete []. delete [] всегда безусловно лезло в самый первый элемент массива за указателем на "векторный" деструктор, забывая при этот о том, что этого первого элемента может и не быть вообще.Добавлено через 21 минуту
1
|
||||||||
|
393 / 165 / 32
Регистрация: 10.12.2015
Сообщений: 717
|
|
| 26.04.2016, 21:29 | |
|
До конца не дочитал. М.б. и пропустил что-то. Кто-то задавался следующим вопросом? c++ язык высокого уровня, компилирует код в нативный под конкретную_платформу/ос, конкретная ОС имеет в своем составе MM, который и занимается управлением памятью. Может кто-то попытался пропустить исполняемый модуль через strace, например (это я намекаю)? Программе вовсе не обязательно "знать" размер массива, она его и "не знает", а всего лишь говорит ядру "дай мне столько памяти" и ядро возвращает адрес нулевой страницы. Потом процесс говорит ядру "эта память мне больше не нужна" и ядро перераспределяет страницы по своим заумным алгоритмам. Как публике такое объяснение?
0
|
|
|
24 / 24 / 8
Регистрация: 02.02.2016
Сообщений: 135
|
||
| 26.04.2016, 22:40 [ТС] | ||
|
Нового для себя к сожалению ничего не нашел. Точнее нашел, но все не по теме. А это уже демагогия (достижение любых целей кроме реальной). Для себя вынес, что: как реально работает связка компилятор-менеджер памяти не знает никто. Ибо нет универсального механизма и каждый реализует как хочет. Главное чтобы удовлетворяло стандарту C. А значит я не совсем корректно задал вопрос. Надо было внести корректировку, что интересен механизм выделения памяти под встроенные типы переменных для MSVS. К сожалению и в этом топике нет реального ответа. Как говорят: "Тема Си... не раскрыта". ЗЫ. Ну может когда-нибудь, человек знающий этот механизм, ответит.
0
|
||
|
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
|
|
| 26.04.2016, 23:01 | |
|
Petrolion, а я три раза прочитал твоё сообщение и не понял, что ты хочешь. Сначала говоришь, что вынес для себя, что каждый реализует как хочет, затем что-то про встроенные типы.
0
|
|
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,413
|
|||||
| 26.04.2016, 23:05 | |||||
|
Однако в ветке по ссылке я детально описал, как это делается в большинстве реальных реализаций. (Я скромничаю, когда, говорю "в большинстве". На само деле так делается везде). Никакой "демагогии" там нет. Именно так все это и работает.
1
|
|||||
|
393 / 165 / 32
Регистрация: 10.12.2015
Сообщений: 717
|
||
| 26.04.2016, 23:09 | ||
|
TheCalligrapher, я читал твой пост с развернутым ответом. Всё четко. У меня только закралось парочка философских вопросов, а зачем это вообще надо? Сишные компиляторы тоже так поступают?
0
|
||
|
24 / 24 / 8
Регистрация: 02.02.2016
Сообщений: 135
|
|
| 26.04.2016, 23:34 [ТС] | |
|
to TheCalligrapher
Конечно мы говорим о C++ А в конце была несколько измененная известная летучая фраза :-) Но что было из начальных вопросов... 1. Структура выделения памяти в динамических массивах. 2. Формат и точное местоположение этой служебной информации. 3. Как delete [] определяет размер возвращаемой памяти. Все три вопроса, как видно, тесно связаны. И еще скорректировано рассматриваются для MSVS и их встроенных типов данных (long long, int, char,....) Возможно я совсем не просветленный, но конкретностей в топиках для данных вопросов, простите, не увидел. Не хочу никого обидеть, но если бы так описывались форматы, к примеру FAT, возникало бы вопросов больше чем было до чтения формата.
0
|
|
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,413
|
||
| 26.04.2016, 23:43 | ||
|
В языке С нигде не необходимости знать размер выделенного блока динамической памяти на уровне "ядра языка" (core language). Т.е. компилятору С эта тема не интересна вообще. Вопросы размера блока динамической памяти там решаются на уровне библиотеки - размер блока просто записывается в начало блока функциями библиотеки и читается оттуда функциями библиотеки. А вот в языке С++ эта тема уже "проникает" на уровень ядра языка - компилятору иногда надо знать, сколько деструкторов вызывать. Поэтому структура блока, выделенного new [] - это вопрос уровня ядра языка, уровня компилятора. "Сколько деструкторов вызывать" - это и есть, "зачем это вообще" надо. Там же вроде детально объяснялось.
0
|
||
| 26.04.2016, 23:43 | |
|
Составить программу для выделения D - экстремального подмножества в заданном графе согласно указанному алгоритму его выделения Очищение памяти (одномерный динамический массив) Перевыделение памяти в функции - динамический массив Динамический массив: программа выдает ошибку памяти Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации:
1. Вернуть возможность использования знаков | 1 l I;. . .
|
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С.
Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
|
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию?
Фраза «Любая достаточно развитая технология неотличима от магии». . .
|
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль?
Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
|
|
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология.
«Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
|
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки.
Добавлены следующие реквизиты типа Булево:
- Буквы;
- Цифры;
- Символы.
Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
|
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей.
Самым главным критерием для. . .
|
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store.
И так:
1. Скачиваем с. . .
|