Что нужно учитывать:
- в Win32 процессу доступно виртуальное адресное пространство 2Гб, не более того. Дальнейшие адреса зарезервированы для ОС (туда идёт мэппинг системных библиотек, KERNEL32, насколько помню, как раз там же и т.п., хотя для пользователя совершенно неясно, подо что так много зарезервировано). Есть у NT начиная с 2000-го ключик в boot.ini, который отдаёт процессам 3Гб адресного пространства.
- если запуск идёт на Win64, то там вообще какие-то свои законы для 32-разрядной подсистемы.
- некоторое количество памяти отжирают служебные структуры кучи. Но, конечно, не 0.4 Гб, тем более, что у Вас несколько крупных объектов.
- эффективно распределить 0.4 Гб может оказаться невозможным из-за фрагментации. Там просто реально может не найтись непрерывного куска 130Мб, который Вы просите очередным NEW. Там ведь сидят модули, DLL-ки, наконец, сама WinApi в графическом приложении наверняка имеет выделенную память в пользовательском пространстве, в системной куче процесса (WinApi.HeapAlloc).

В общих чертах так.