Попытка выделить максимально возможную память для обработки
Это на Windows XP и приложение разрабатывается на C++ (VS2010).
Я хочу, чтобы мое приложение продолжало распределять память, пока оно не достигнет своих пределов без каких-либо проблем. Но если он выделяет целые 2 ГБ (максимальный предел для 32-разрядной Windows), он перезаписывает пространство для стека и в конечном итоге вылетает. Как этого можно избежать? (Кстати, я использую malloc
а также new
для выделения памяти)
Я считаю, что из "Частных байтов", "Виртуальных байтов" и "Рабочего набора" я должен следить за "Виртуальными байтами". Но я не совсем уверен в этом. (Является ли это "Виртуальными байтами" или "Приватными байтами" при касании 2 ГБ, мы можем быть уверены, что достигли предела?)
Если это "Виртуальные байты", я должен контролировать, я не уверен, какое поле
_PROCESS_MEMORY_COUNTERS_EX
отражает виртуальные байтыЧтобы приложение работало безопасно и без проблем, сколько памяти я должен оставить в стороне? (Это просто размер стека = количество потоков x размер стека на поток или есть нечто большее)
2 ответа
Менеджер программ оставит место для вашего стека и других данных. Вы можете вызывать malloc и new, пока они не вернут 0 (NULL). Я думаю, что рабочий набор - это переменная, которую вы должны отслеживать.
Вы можете получить доступ к 3Gb, изменив файл boot.ini
[boot loader]
timeout=5
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect /3GB
Затем вам нужно изменить ваш исполняемый файл с помощью editbin (также поставляется с экспресс-версией)
editbin /LARGEADDRESSAWARE xxx.exe
Это работает для меня. Если это не работает, то дополнительный заголовок отсутствует. Я не знаю, как вы заставляете заголовок быть там.
Если у вас много времени - это длинная история http://www.dansdata.com/askdan00015.htm