Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/10: Рейтинг темы: голосов - 10, средняя оценка - 4.60
PlayaRC
5 / 5 / 1
Регистрация: 10.03.2012
Сообщений: 121
1

Как malloc выделяет память?

07.06.2014, 19:43. Просмотров 1984. Ответов 22
Метки нет (Все метки)

Почему, если я выделяю память для одного int, вот так
C++
1
int *myArray = (int *)malloc(sizeof(int));
То в итоге я могу записать в myArray 8 интов
C++
1
2
        for (int i = 0; i < 8; i++)
            myArray[i] = i + 1;
и программа закончит работу вообще без ошибок, а если записать больше (например 100), то они запишутся дальше в памяти, но программа завершиться с ошибкой " Куча была повреждена (параметры: 0x77D2D338)."
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2014, 19:43
Ответы с готовыми решениями:

Realloc выделяет память для массива int и не выделяет память для массива double
Скажите пожалуйста, почему вот этот код работает: #include &lt;iostream&gt;...

Действительно ли new выделяет память в куче (heap)?
Чаще всего пишут что в куче . Ок . Куча процесса это вроде бы блок вполне...

malloc и new (динамическая память)
Ребят, привет. ОЧчень интересует вопрос с динамической памятью . Как эта штука...

Организовать функцию, которая выделяет память под строку
1) Организовать функцию, которая выделяет память под строку. Размер памяти...

Написать программу, которая вводит целое число n и выделяет память
3. Написать программу, которая вводит целое число n и выделяет память для...

22
PlayaRC
5 / 5 / 1
Регистрация: 10.03.2012
Сообщений: 121
08.06.2014, 12:42  [ТС] 21
вот теперь я окончательно запутался.
Как все понимаю я: ОС выделяет память блоками. Размер блока кратен размер страница опер.памяти (обычно это 4096 байт, 4 кб). malloc внутри использует VirtualAlloc, которая даже при запросе 1 байта выделит все равно 4 кбайта. new внутри использует malloc, так что все сводиться в тому же - при запросе 1б дают 4кб. Тогда почему, при выделении 4 байт памяти напрямую через VirtualAlloc я могу по возвращенному указателю записать 1024 инта (если sizeof(int) = 4 байта), а если выделить 4 байта через malloc - меньше, если по сути она использует VirtualAlloc? Что malloc делает внутри или я чего-то не понял?

Заранее спасибо за пояснения!
0
Renji
2151 / 1584 / 480
Регистрация: 05.06.2014
Сообщений: 4,605
08.06.2014, 13:06 22
Цитата Сообщение от PlayaRC Посмотреть сообщение
Тогда почему, при выделении 4 байт памяти напрямую через VirtualAlloc я могу по возвращенному указателю записать 1024 инта (если sizeof(int) = 4 байта), а если выделить 4 байта через malloc - меньше, если по сути она использует VirtualAlloc?
При запуске программы ей доступно адресное пространство в четыре гигабайта. На бумаге. Реально большая часть этих адресов ведет в никуда (буквально).
VirtualAlloc связывает часть адресов с физической памятью. Теперь они доступны для чтения-записи. Адреса с которыми работает VirtualAlloc всегда выравнены на границу страницы.
malloc ищет четыре бесхозных байта которые вроде и связаны с физической памятью, но никем не используются. Если найдет - возвращает пользователю и делает себе пометку "эти четыре байта заняты". Если не найдет - пинает VirtualAlloc и просит еще мегабайтик дать.
Когда пользователь пытается что-то, куда-то писать, процессор проверяет "а не идет ли запись в некуда?". Если запись идет в никуда, то процессор ругается нехорошими словами.
0
uglyPinokkio
326 / 229 / 55
Регистрация: 30.05.2014
Сообщений: 682
08.06.2014, 13:13 23
Цитата Сообщение от PlayaRC Посмотреть сообщение
Что malloc делает внутри или я чего-то не понял?
Регистрирует размер выделенного блока памяти в таблице менеждера памяти процесса.
0
08.06.2014, 13:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2014, 13:13

И снова динамическая память, malloc и free в конструкторе и деструкторе
Короче есть, класс, который например хранит строку, я его храню в структуре,...

Программа, которая считывает количество товаров и выделяет память для сохранения их цен
6. Напишите программу, которая считывает количество товаров и выделяет память...

Нужно ли под массив выделять память функциями malloc или new?
собственно вот программа по вводу размера массива, вводу массива, сортировки:...


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

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru