У меня следующая проблема:
Программа, запускаемая на машине с Windows (32-битная память, 3,1 ГБ, VC ++ 2008 и скомпилированный код mingw), завершается с ошибкой bad_alloc
(после выделения около 1,2 ГБ; исключение выдается при попытке выделить вектор с 9 миллионами удваивается, т.е. около 75 МБ) с достаточным объемом оперативной памяти (по крайней мере, в соответствии с диспетчером задач).
Та же программа, запущенная на машинах Linux (32-битная, 4 ГБ памяти; 32-битная, 2 ГБ памяти), работает нормально с пиковым использованием памяти около 1,6 ГБ. Интересно, что код win32, сгенерированный mingw, запущенным на машине Linux 4Gb под Wine, также не работает с bad_alloc, хотя и в другом (более позднем) месте, чем при запуске под windows ...
Каковы возможные проблемы?
- фрагментация кучи? (Как я узнаю? Как это можно решить?)
- куча коррупции? (Я запустил код с включенным pageheap.exe без сообщений об ошибках; реализовал векторный доступ с проверкой границ - опять же, без ошибок; код по существу не содержит указателей, используются только
std::vector
s и std::list
s. Бег
программа под Valgrind (memcheck) занимает слишком много памяти и преждевременно завершает работу, но не находит ошибок)
- Недостаточно памяти ??? (Должно быть достаточно памяти)
Кроме того, что может быть причиной сбоя версии Windows, пока
версия linux работает (и даже на машинах с меньшим объемом памяти)? (Также обратите внимание, что
флаг компоновщика / LARGEADDRESSAWARE используется с VC + 2008, если это может иметь какой-либо эффект)
Любые идеи будут высоко оценены, я в конце концов с этим ...: - (