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

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

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

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

07.06.2014, 19:43. Просмотров 1483. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как malloc выделяет память? (C++):

Realloc выделяет память для массива int и не выделяет память для массива double - C++
Скажите пожалуйста, почему вот этот код работает: #include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; int main()...

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

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

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

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

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

22
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
08.06.2014, 08:24 #16
Цитата Сообщение от ValeryS Посмотреть сообщение
значит 4 КБ это это тысяча int
Чем отличается программист от обычного человека:
Обычный человек считает, что килобайт это тысяча байт, а программист что в килограмме 1024 грамма.

Цитата Сообщение от ValeryS Посмотреть сообщение
Да и кто сказал что malloc оперирует страницами?
Страницами оперирует не malloc а менеджер памяти.

http://wm-help.net/books-online/book/59464/59464-6.html
0
Croessmah
Эксперт CЭксперт С++
13408 / 7558 / 853
Регистрация: 27.09.2012
Сообщений: 18,590
Записей в блоге: 3
Завершенные тесты: 1
08.06.2014, 08:38 #17
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
а программист что в килограмме 1024 грамма.
еще скажите, что в банк ходит ругаться из-за того, что банкомат выдал купюры номиналом 2, 4, 8 рублей
0
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
08.06.2014, 08:46 #18
Цитата Сообщение от Croessmah Посмотреть сообщение
еще скажите, что в банк ходит ругаться из-за того, что банкомат выдал купюры номиналом 2, 4, 8 рублей
Ну бородатый анекдот же.
0
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,918
08.06.2014, 08:58 #19
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Страницами оперирует не malloc а менеджер памяти.
А зачем ты мне это рассказываешь?
расскажи это Renji, который на вопрос
Цитата Сообщение от PlayaRC
Как malloc выделяет память?
отвечает
Цитата Сообщение от Renji Посмотреть сообщение
на машинном уровне память выделяется только страницами по четыре килобайта. Проверка допустимости чтения/записи тоже делается для всей страницы, а не для каждого int в отдельности.
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Обычный человек считает, что килобайт это тысяча байт, а программист что в килограмме 1024 грамма.
Я человек а не машина, и мне удобней оперировать человеческой а не машинной математикой
но могу переписать
значит 4 КБ это это тысяча двадцать четыре int
так устроит
хотя опять засада получается
никто не гарантировал,что int 4 байта
0
Renji
1925 / 1323 / 298
Регистрация: 05.06.2014
Сообщений: 3,808
08.06.2014, 11:44 #20
расскажи это Renji, который на вопрос
Вопрос был "почему я могу записать в myArray 8 интов". Защита памяти от записи выполняется на уровне процессора. Процессор оперирует страницами по четыре кило. Чем там оперирует malloc не важно, о его существовании процессор ничего не знает.
0
PlayaRC
5 / 5 / 0
Регистрация: 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
1925 / 1323 / 298
Регистрация: 05.06.2014
Сообщений: 3,808
08.06.2014, 13:06 #22
Цитата Сообщение от PlayaRC Посмотреть сообщение
Тогда почему, при выделении 4 байт памяти напрямую через VirtualAlloc я могу по возвращенному указателю записать 1024 инта (если sizeof(int) = 4 байта), а если выделить 4 байта через malloc - меньше, если по сути она использует VirtualAlloc?
При запуске программы ей доступно адресное пространство в четыре гигабайта. На бумаге. Реально большая часть этих адресов ведет в никуда (буквально).
VirtualAlloc связывает часть адресов с физической памятью. Теперь они доступны для чтения-записи. Адреса с которыми работает VirtualAlloc всегда выравнены на границу страницы.
malloc ищет четыре бесхозных байта которые вроде и связаны с физической памятью, но никем не используются. Если найдет - возвращает пользователю и делает себе пометку "эти четыре байта заняты". Если не найдет - пинает VirtualAlloc и просит еще мегабайтик дать.
Когда пользователь пытается что-то, куда-то писать, процессор проверяет "а не идет ли запись в некуда?". Если запись идет в никуда, то процессор ругается нехорошими словами.
0
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
08.06.2014, 13:13 #23
Цитата Сообщение от PlayaRC Посмотреть сообщение
Что malloc делает внутри или я чего-то не понял?
Регистрирует размер выделенного блока памяти в таблице менеждера памяти процесса.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2014, 13:13
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
23
Yandex
Объявления
08.06.2014, 13:13
Ответ Создать тему
Опции темы

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