Форум программистов, компьютерный форум 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)."
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.06.2014, 20:59     Как malloc выделяет память? #2
выход за пределы массива не контролируется

Цитата Сообщение от PlayaRC Посмотреть сообщение
То в итоге я могу записать в myArray 8 интов
for (int i = 0; i < 8; i++)
* myArray[i] = i + 1;
и программа закончит работу вообще без ошибок, а если записать больше (например 100), то они запишутся дальше в памяти, но программа завершиться с ошибкой " Куча была повреждена (параметры: 0x77D2D338)."
невезение
PlayaRC
4 / 4 / 0
Регистрация: 10.03.2012
Сообщений: 121
07.06.2014, 21:01  [ТС]     Как malloc выделяет память? #3
выход за пределы массива не контролируется
это понятно! я это специально и сделал! мне интересно почему память выделил 4 байта, а вместилось 32?
Pjeroo
Землянин
 Аватар для Pjeroo
33 / 33 / 12
Регистрация: 15.01.2013
Сообщений: 313
07.06.2014, 21:11     Как malloc выделяет память? #4
PlayaRC, под свою программу Вы выделили именно 4 байта, остальное это не размеченная область памяти, в ней хранится мусор и Вы можете её использовать, но не факт, что все будет гладко, можно набрести на область памяти другого процесса или типа того.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.06.2014, 21:14     Как malloc выделяет память? #5
Цитата Сообщение от PlayaRC Посмотреть сообщение
мне интересно почему память выделил 4 байта, а вместилось 32?
malloc это абстракция для получения памяти и нечего лезть в детали реализации
kupnu4
26 / 26 / 9
Регистрация: 03.05.2013
Сообщений: 71
07.06.2014, 21:15     Как malloc выделяет память? #6
так тебе ведь сказали, что тебе просто не повезло. вместилось 8 int'ов по стечению обстоятельств. могло вместится больше, а могло меньше. ты начал писать в чужую память начиная со второго элемента.
PlayaRC
4 / 4 / 0
Регистрация: 10.03.2012
Сообщений: 121
07.06.2014, 21:17  [ТС]     Как malloc выделяет память? #7
PlayaRC, под свою программу Вы выделили именно 4 байта, остальное это не размеченная область памяти, в ней хранится мусор и Вы можете её использовать, но не факт, что все будет гладко, можно набрести на область памяти другого процесса или типа того.
то есть 32 байта - это случайное число, могло быть и больше и меньше, так? это просто число байт, которые свободны от выделенного мне места до уже занятого участка памяти?

Добавлено через 2 минуты
тогда в чем отличия экзепшенов "Перполнения буфера" и "Куча повреждена"? Если и там, и там можно забрести в память выделенную другому процессу и записать туда что-то свое
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.06.2014, 21:39     Как malloc выделяет память? #8
Цитата Сообщение от PlayaRC Посмотреть сообщение
тогда в чем отличия экзепшенов "Перполнения буфера" и "Куча повреждена"?
чтоб программист на этапе разработки знал в чем проблема
PlayaRC
4 / 4 / 0
Регистрация: 10.03.2012
Сообщений: 121
07.06.2014, 21:43  [ТС]     Как malloc выделяет память? #9
чтоб программист на этапе разработки знал в чем проблема
то есть по сути это одно и тоже? что в первом, что во втором можно залезть в память выделенную другой программе?

подробнее, пожалуйста, не могу понять разницу! заранее спасибо
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.06.2014, 21:51     Как malloc выделяет память? #10
Цитата Сообщение от PlayaRC Посмотреть сообщение
подробнее, пожалуйста, не могу понять разницу! заранее спасибо
что подробнее если тут все логично
C++
1
2
int* ptr;
*ptr = 42; //heap corruption
C++
1
2
char buf[]="abc", buf2[]="def";
strcat(buf, buf2);//buffer overflow
да обе ошибки завязаны на запись в чужую память, но это разные ошибки

Не по теме:

strcat взят для иллюстрации и он вовсе не обязательно бросит такой исключение так как ничего не знает о размере буферов

ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
07.06.2014, 22:07     Как malloc выделяет память? #11
Цитата Сообщение от PlayaRC Посмотреть сообщение
То в итоге я могу записать в myArray 8 интов
вопрос какой компилятор?
и какой режим компилирования? отладочная или релизная?
например в отладочном(Debig) режиме VC при выделении памяти создает "подушку безопасности"
выделяет память не только под int но и до и после этой памяти
соответственно когда выходиш за границы массива ты не пишешь в чужую память, а пишешь в "подушку" программа не рухает но при закрытии программы, анализируется целостность подушки и выдает предупреждение " выход за границы"
посмотреть эту подушку можно например так
C++
1
2
3
4
5
int * a=(int *)malloc(sizeof(int));
*a=0x55555555;
char * c=(char*)a;
for(int i=-16;i<16;i++)
  printf(" %x",c[i]);
но все меняется когда выбираешь релиз, подушки уже нет и программа рухает

Добавлено через 1 минуту
Цитата Сообщение от PlayaRC Посмотреть сообщение
Если и там, и там можно забрести в память выделенную другому процессу
память для процессов не пересекаемая
PlayaRC
4 / 4 / 0
Регистрация: 10.03.2012
Сообщений: 121
07.06.2014, 22:30  [ТС]     Как malloc выделяет память? #12
да обе ошибки завязаны на запись в чужую память, но это разные ошибки
че то я и правда попутал) спасибо, теперь все понятно

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
но все меняется когда выбираешь релиз, подушки уже нет и программа рухает
так вот почему у меня не получалось переполнить буфер, нужно релиз выбрать
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
07.06.2014, 22:32     Как malloc выделяет память? #13
Цитата Сообщение от PlayaRC Посмотреть сообщение
так вот почему у меня не получалось переполнить буфер, нужно релиз выбрать
не, можешь и число переполнения больше
Цитата Сообщение от PlayaRC Посмотреть сообщение
а если записать больше (например 100),
чтобы подушку пересечь
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
07.06.2014, 23:46     Как malloc выделяет память? #14
То в итоге я могу записать в myArray 8 интов
Потому что на машинном уровне память выделяется только страницами по четыре килобайта. Проверка допустимости чтения/записи тоже делается для всей страницы, а не для каждого int в отдельности.
тогда в чем отличия экзепшенов "Перполнения буфера" и "Куча повреждена"?
Переполнение буфера происходит в стеке и затирает адрес возврата из текущей процедуры. Соответственно, return будет вести черт знает куда. Например, на вредоносный код. Повреждение кучи подобных веселых последствий иметь скорее всего не будет.
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
08.06.2014, 06:47     Как malloc выделяет память? #15
Цитата Сообщение от Renji Посмотреть сообщение
Потому что на машинном уровне память выделяется только страницами по четыре килобайта. Проверка допустимости чтения/записи тоже делается для всей страницы, а не для каждого int в отдельности.
хорошо
значит 4 КБ это это тысяча int
Цитата Сообщение от PlayaRC Посмотреть сообщение
если записать больше (например 100), то они запишутся дальше в памяти, но программа завершиться с ошибкой " Куча была повреждена
почему?
тысяча больше чем сто

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

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

http://wm-help.net/books-online/book/59464/59464-6.html
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11832 / 6811 / 769
Регистрация: 27.09.2012
Сообщений: 16,887
Записей в блоге: 2
Завершенные тесты: 1
08.06.2014, 08:38     Как malloc выделяет память? #17
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
а программист что в килограмме 1024 грамма.
еще скажите, что в банк ходит ругаться из-за того, что банкомат выдал купюры номиналом 2, 4, 8 рублей
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
08.06.2014, 08:46     Как malloc выделяет память? #18
Цитата Сообщение от Croessmah Посмотреть сообщение
еще скажите, что в банк ходит ругаться из-за того, что банкомат выдал купюры номиналом 2, 4, 8 рублей
Ну бородатый анекдот же.
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
08.06.2014, 08:58     Как malloc выделяет память? #19
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Страницами оперирует не malloc а менеджер памяти.
А зачем ты мне это рассказываешь?
расскажи это Renji, который на вопрос
Цитата Сообщение от PlayaRC
Как malloc выделяет память?
отвечает
Цитата Сообщение от Renji Посмотреть сообщение
на машинном уровне память выделяется только страницами по четыре килобайта. Проверка допустимости чтения/записи тоже делается для всей страницы, а не для каждого int в отдельности.
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Обычный человек считает, что килобайт это тысяча байт, а программист что в килограмме 1024 грамма.
Я человек а не машина, и мне удобней оперировать человеческой а не машинной математикой
но могу переписать
значит 4 КБ это это тысяча двадцать четыре int
так устроит
хотя опять засада получается
никто не гарантировал,что int 4 байта
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2014, 11:44     Как malloc выделяет память?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
08.06.2014, 11:44     Как malloc выделяет память? #20
расскажи это Renji, который на вопрос
Вопрос был "почему я могу записать в myArray 8 интов". Защита памяти от записи выполняется на уровне процессора. Процессор оперирует страницами по четыре кило. Чем там оперирует malloc не важно, о его существовании процессор ничего не знает.
Yandex
Объявления
08.06.2014, 11:44     Как malloc выделяет память?
Ответ Создать тему
Опции темы

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