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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
PlayaRC
5 / 5 / 0
Регистрация: 10.03.2012
Сообщений: 121
#1

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

07.06.2014, 19:43. Просмотров 1419. Ответов 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)."
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2014, 19:43     Как malloc выделяет память?
Посмотрите здесь:

Действительно ли new выделяет память в куче (heap)? - C++
Чаще всего пишут что в куче . Ок . Куча процесса это вроде бы блок вполне конкретного размера . Я помню раньше это было 1Мб для intel и 4Мб...

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

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

Написать программу, которая вводит целое число n и выделяет память - C++
3. Написать программу, которая вводит целое число n и выделяет память для массива из n данных типа: char, int, double. Перед завершением...

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

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

Нужно ли под массив выделять память функциями malloc или new? - C++
собственно вот программа по вводу размера массива, вводу массива, сортировки: #include &lt;iostream&gt; #include &lt;windows.h&gt; using...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
PlayaRC
5 / 5 / 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
1853 / 1271 / 290
Регистрация: 05.06.2014
Сообщений: 3,627
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 выделяет память?
Еще ссылки по теме:

Выделить память под двумерный массив за один вызов функции malloc - C++
Выделить память под двумерный массив за один вызов функции malloc Если можно - с комментариями

Можно ли выделять память под объект класса с помощью функций calloc, malloc или realloc? - C++
Интересует данный вопрос. Можно ли и имеет ли вобще смысл например выделять память под объект класса с помощью функций calloc, malloc или...

Не понимаю как работает функция malloc - C++
Можете объяснить, что здесь значит каждый символ и элемент в этой строчке? mas=(int*)malloc(n*sizeof(int));и почему они находятся именно в...

Как string создает строку?(calloc, malloc) - C++
стринг создает строку с помощью calloc, malloc?

При выделении памяти через malloc, как создавать объекты ? - C++
Выделяю память через malloc под 4 объекта, как их создать ? myClass * ptr = (myClass*) malloc(sizeof(myClass)*4); for(int i = 0;...


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

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

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