У меня скорее вопрос чем проблема. Malloc не выводит ошибки если я пытаюсь выделить 8gb памяти, но на ноутбуке ее всего 6gb. Как такое возможно (в линуксе) ?
Во-первых, максимальный размер доступной для выделения памяти не имеет никакого отношения к размеру установленного в вашем компьютере ОЗУ. Размер ограничен лишь размером адресного пространства процесса. Почитайте о том, как работают платформы с виртуальной памятью.
Во-вторых, в конфигурации по умолчанию ОС типа Linux допускают т.наз. "overcommit", т.е. спокойно позволяют пользователю распределять регионы адресного пространства процесса даже если физических ресурсов машины (ОЗУ и размера swap области) недостаточно для хранения такого объема данных. Физическая "материализация" выделенной памяти происходит постранично, не в момент выполнения malloc
, а намного позже - тогда, когда вы начнете заполнять эту память своими данными. Вот именно при заполнении очередной страницы данными вы в определенный момент можете наткнуться на нехватку физических ресурсов для "материализации" этой страницы и ваша программа "упадет". Сам же malloc
ничего фактически не делает, кроме пометки региона адресного пространства как занятого.
Таким образом тот факт, что malloc
вам что-то позволил выделить, еще ничего не значит. malloc
почти ничего не делает. Для того, чтобы убедиться, что ваше выделение памяти действительно "удалось", вам надо еще записать в весь выделенный блок памяти какие-то данные.
Происходит, так называемый overcommit. Эта настройка регулируется файлом /proc/sys/vm/overcommit_memory
. Значение 0 (по умолчанию) включает некую эвристику, значение 1 всегда разрешает перевыделение памяти, значение 2 отключает такое поведение. В последнем случае проверка доступности памяти происходит после достижения CommitLimit при каждом вызове mmap(2). Примечание: malloc(3) в свой реализации использует mmap(2) при необходимости расширения памяти процесса. Подробнее см. страницу руководства proc(5).
Вы можете даже провести эксперимент. Отключите overcommit и попытайтесь запустить вашу тестовую программу.
# echo 2 > /proc/sys/vm/overcommit_memory
Виртуальный выделенный сервер (VDS) становится отличным выбором
Недавно перешел на ubuntu и возникла проблема с работой библиотек "iostreamh" и "conio
Перевожу тут man руководство и вот что пока что интересно
такая проблема, не могу добавить что-либо на экран (какие-либо элементы: кнопки, текстовые поля и тд