Отказ от ответственности: я отмечаю вопрос как C и C ++, так как использую std::malloc
в проекте C ++.
Мое приложение C ++ многократно выделяет / освобождает часть памяти. В большинстве случаев я использую new
/ delete
, но в некоторых из них (пользовательских контейнерах) я использую std::malloc
. Оператор new
никогда не возвращает nullptr и не выдает bad_alloc
, но std::malloc
иногда возвращает nullptr на некоторых машинах.
Пока что мы собираем только для Win64, и подавляющее большинство пользователей используют Windows 10.
В чем может быть причина?
- Я исключаю истощение физической памяти, так как приложение выделяет менее 3 Гб памяти, а на этих машинах 8-16 Гб + подкачка.
- Аргумент Malloc всегда больше нуля и меньше 256 Мб. Это подтверждается утверждениями.
- Гипотеза 1: может ли это быть исчерпание адресного пространства из-за фрагментации? Перераспределение небольших буферов в приложении может происходить много раз в секунду, но их размеры обычно составляют несколько килобайт.
- Гипотеза 2: может ли это быть повреждение памяти из-за ошибки в приложении? Сохраняет ли Windows некоторую информацию службы кучи в доступной для приложения памяти, где приложение может перезаписать ее без сбоев из-за нарушения прав доступа? Не могли бы вы предоставить некоторые ссылки на объяснение управления кучей Windows.
PS Я использую только кучу по умолчанию, нет выделенных пользователем куч WinAPI.