Одно предложение: взгляните на базовые адреса библиотек DLL, которые загружаются в пространство процесса в режиме выпуска и отладки, и посмотрите, есть ли большая разница. Возможно, что в случае выпуска есть библиотеки DLL, загруженные по адресам, так что, хотя в целом достаточно свободного места для поддержки вызова LocalAlloc (), не хватает непрерывного адресного пространства для его удовлетворения. (Для надуманного примера предположим, что библиотека DLL загружена в 0x40000000 (1 ГБ), другая - в 0x80000000 (2 ГБ), а другая - в 0xC0000000 (3 ГБ)). Даже если эти DLL действительно малы, процесс не может выделить больше 1 Гб за раз, так как нет свободного непрерывного блока адресного пространства, это достаточно большой).
Вы также можете получить вариант этой проблемы, если распределение памяти происходило в другом порядке и при отладке, и при выпуске.