Я не знаю точно, что происходит в вашем сценарии. Но раньше я видел, как диалог открытия файла вызывал другие проблемы с памятью.
Когда этот диалог вызывается, в ваш процесс может загружаться множество вещей. В частности, расширения оболочки, которые появляются в проводнике Windows, также загружаются с помощью диалога открытия файла. Вот как вы можете щелкнуть правой кнопкой мыши файл в этом диалоговом окне и получить все эти нестандартные вкусности. Однако это означает, что библиотеки dll, лежащие в основе этих расширений, загружаются в ваш процесс.
Из опыта я видел, что некоторые из этих библиотек не выгружаются после закрытия диалога открытия файла. Вместо этого они остаются присутствующими, занимая часть адресного пространства вашего процесса. (Может быть, это какая-то ошибка со стороны этих библиотек, или, может быть, это какая-то «оптимизация» для сохранения их загрузки в случае повторного использования диалога открытия файла.)
Следствием этого, с которым я имел дело, было то, что это повлияло на успешное выделение 1 ГБ памяти. Перед открытием диалога было доступно большое пространство адресного пространства, и выделение 1 ГБ могло быть успешным. Однако после открытия диалогового окна пара dll расширения оболочки приземлились прямо в середине доступного адресного пространства и разделили его на куски размером менее 1 ГБ, что привело к сбою выделения.
Я знаю, что этот анекдот не имеет прямого отношения к тому, что вы делаете, поскольку вы выделяете много небольших сумм вместо одной большой суммы. (И в моем сценарии это был не malloc. Я думаю, что это было что-то вроде VirtualAlloc или что-то подобное.) Но я бы предположил, что может происходить что-то похожее.
Диалог открытия файла может загружать что-то в ваш процесс, что каким-то образом вставляет барьер в пространство, которое обычно использует malloc. Но почему-то это происходит только тогда, когда вы используете этот большой размер стека, потому что я предполагаю, что дополнительные 99 МБ пространства, зарезервированного для стека, каким-то образом перестраивают оставшуюся часть адресного пространства, чтобы восприимчиво к этой проблеме.
Когда я исследовал собственную проблему, я использовал VMMap , чтобы сделать снимки адресного пространства моего процесса в различных точках, чтобы выяснить, что происходит. Возможно, вам повезет. Просто обратите внимание, что он смотрит на адресное пространство так, как его видит операционная система, а не так, как вы видите его внутри контекста определенного языка, такого как C ++. Так что не всегда легко выяснить, какая конкретная часть памяти используется malloc или любым другим механизмом распределения.