Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
PlayaRC
4 / 4 / 0
Регистрация: 10.03.2012
Сообщений: 121
07.06.2014, 19:43     Как malloc выделяет память? #1
Почему, если я выделяю память для одного 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)."
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2014, 19:43     Как malloc выделяет память?
Посмотрите здесь:

Написать программу, которая вводит целое число n и выделяет память C++
C++ Как string создает строку?(calloc, malloc)
malloc и new (динамическая память) C++
C++ Выделить память под двумерный массив за один вызов функции malloc
Нужно ли под массив выделять память функциями malloc или new? C++
Не понимаю как работает функция malloc C++
И снова динамическая память, malloc и free в конструкторе и деструкторе C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
PlayaRC
4 / 4 / 0
Регистрация: 10.03.2012
Сообщений: 121
08.06.2014, 12:42  [ТС]     Как malloc выделяет память? #21
вот теперь я окончательно запутался.
Как все понимаю я: ОС выделяет память блоками. Размер блока кратен размер страница опер.памяти (обычно это 4096 байт, 4 кб). malloc внутри использует VirtualAlloc, которая даже при запросе 1 байта выделит все равно 4 кбайта. new внутри использует malloc, так что все сводиться в тому же - при запросе 1б дают 4кб. Тогда почему, при выделении 4 байт памяти напрямую через VirtualAlloc я могу по возвращенному указателю записать 1024 инта (если sizeof(int) = 4 байта), а если выделить 4 байта через malloc - меньше, если по сути она использует VirtualAlloc? Что malloc делает внутри или я чего-то не понял?

Заранее спасибо за пояснения!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Renji
1621 / 1069 / 260
Регистрация: 05.06.2014
Сообщений: 3,161
08.06.2014, 13:06     Как malloc выделяет память? #22
Цитата Сообщение от PlayaRC Посмотреть сообщение
Тогда почему, при выделении 4 байт памяти напрямую через VirtualAlloc я могу по возвращенному указателю записать 1024 инта (если sizeof(int) = 4 байта), а если выделить 4 байта через malloc - меньше, если по сути она использует VirtualAlloc?
При запуске программы ей доступно адресное пространство в четыре гигабайта. На бумаге. Реально большая часть этих адресов ведет в никуда (буквально).
VirtualAlloc связывает часть адресов с физической памятью. Теперь они доступны для чтения-записи. Адреса с которыми работает VirtualAlloc всегда выравнены на границу страницы.
malloc ищет четыре бесхозных байта которые вроде и связаны с физической памятью, но никем не используются. Если найдет - возвращает пользователю и делает себе пометку "эти четыре байта заняты". Если не найдет - пинает VirtualAlloc и просит еще мегабайтик дать.
Когда пользователь пытается что-то, куда-то писать, процессор проверяет "а не идет ли запись в некуда?". Если запись идет в никуда, то процессор ругается нехорошими словами.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2014, 13:13     Как malloc выделяет память?
Еще ссылки по теме:

C++ Программа, которая считывает количество товаров и выделяет память для сохранения их цен
C++ Можно ли выделять память под объект класса с помощью функций calloc, malloc или realloc?
C++ Организовать функцию, которая выделяет память под строку
Действительно ли new выделяет память в куче (heap)? C++
Realloc выделяет память для массива int и не выделяет память для массива double C++

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

Или воспользуйтесь поиском по форуму:
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
08.06.2014, 13:13     Как malloc выделяет память? #23
Цитата Сообщение от PlayaRC Посмотреть сообщение
Что malloc делает внутри или я чего-то не понял?
Регистрирует размер выделенного блока памяти в таблице менеждера памяти процесса.
Yandex
Объявления
08.06.2014, 13:13     Как malloc выделяет память?
Ответ Создать тему
Опции темы

Текущее время: 17:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru