Это относится к Windows XP, и приложение разрабатывается в C++ (VS2010).
Я хочу, чтобы мое приложение продолжало выделять память, пока оно не достигнет своих пределов без каких-либо проблем. Но если он выделяет целые 2 ГБ (максимальный предел для 32-разрядной Windows), он перезаписывает пространство для стека и, в конце концов, сбой. Как этого можно избежать? (Кстати, я использую malloc
и new
для выделения памяти)
Из "Частных байтов", "Виртуальных байтов" и "Рабочего набора", я считаю, что я должен отслеживать "Виртуальные байты". Но я не совсем уверен в этом. (Является ли это "Виртуальные байты" или "Частные байты" при касании 2 ГБ, мы можем быть уверены, что коснулись предела?)
Если это "виртуальные байты", я должен контролировать, я не уверен, в каком поле _PROCESS_MEMORY_COUNTERS_EX
отображены виртуальные байты
Чтобы приложение работало безопасно и плавно, сколько памяти я должен держать в стороне? (Это просто размер стека = количество потоков x Размер стека в потоке или есть что-то большее)
Вы можете получить доступ к 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
Менеджер программы не оставляет места для вашего стека и других данных. Вы можете вызвать malloc и new, пока они не вернут 0 (NULL). Я думаю, что рабочий набор - это переменная, которую вы должны контролировать.