Почему malloc всегда возвращает NULL - PullRequest
6 голосов
/ 02 марта 2010

Моя среда разработки - VS2008, DX9, Windows XP. Я пытаюсь добавить обработку защиты в случае нехватки памяти. Когда malloc возвращает значение NULL, я помещаю некоторый ресурс на диск и освобождаю ресурсы в памяти.

Но иногда malloc всегда возвращает NULL, даже если я освобождаю большую часть ресурсов и использую память, а размер виртуальной машины в диспетчере задач составляет всего 800 МБ.

Я думаю, что использование malloc для выделения 88 байт должно подойти, когда использование памяти процессом составляет всего 800 МБ. Но malloc всегда возвращает NULL.

Может ли это быть фрагментацией памяти? Это не выглядит так, поскольку использование памяти процессом не слишком много.

альтернативный текст http://i.imagehost.org/0267/Snap2.jpg

Ответы [ 3 ]

2 голосов
/ 02 марта 2010

Это может быть фрагментация виртуального адресного пространства. Один из способов проверить это - позвонить HeapCompact(GetProcessHeap(), 0). Если это освобождает достаточно памяти, то это вероятная причина.

Еще одна похожая причина - запуск из отладчика; это заставляет Windows использовать кучу отладки, которая действительно очень плохо работает в течение длительного периода времени. Чтобы отключить это поведение, установите _NO_DEBUG_HEAP=1 в среде и запустите.

2 голосов
/ 02 марта 2010

Вы упомянули фрагментацию памяти, и это, безусловно, будет мое первое предположение. Попробуйте загрузить это приложение. Он называется Address Space Monitor и должен быть в состоянии показать вам, если это проблема фрагментации.

0 голосов
/ 02 марта 2010

Другая возможность состоит в том, что в вашей программе может быть ошибка. Вы думаете, что запрашиваете 88 байтов, но, возможно, вы передаете неинициализированную переменную и запрашивает сотни мегабайт. Или, может быть, что-то, что вы сделали ранее, перезапустило буфер и повредило кучу, после чего malloc () потерпел неудачу навсегда.

...