Попытка выделить максимально возможную память для обработки

Это на Windows XP и приложение разрабатывается на C++ (VS2010).

Я хочу, чтобы мое приложение продолжало распределять память, пока оно не достигнет своих пределов без каких-либо проблем. Но если он выделяет целые 2 ГБ (максимальный предел для 32-разрядной Windows), он перезаписывает пространство для стека и в конечном итоге вылетает. Как этого можно избежать? (Кстати, я использую malloc а также new для выделения памяти)

  1. Я считаю, что из "Частных байтов", "Виртуальных байтов" и "Рабочего набора" я должен следить за "Виртуальными байтами". Но я не совсем уверен в этом. (Является ли это "Виртуальными байтами" или "Приватными байтами" при касании 2 ГБ, мы можем быть уверены, что достигли предела?)

  2. Если это "Виртуальные байты", я должен контролировать, я не уверен, какое поле _PROCESS_MEMORY_COUNTERS_EX отражает виртуальные байты

  3. Чтобы приложение работало безопасно и без проблем, сколько памяти я должен оставить в стороне? (Это просто размер стека = количество потоков 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

Другие вопросы по тегам