Malloc иногда возвращает ноль на Win64 - PullRequest
4 голосов
/ 30 октября 2019

Отказ от ответственности: я отмечаю вопрос как 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.

...