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

0

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

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

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

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

  3. Чтобы приложение работало безопасно и плавно, сколько памяти я должен держать в стороне? (Это просто размер стека = количество потоков x Размер стека в потоке или есть что-то большее)

  • 1
    Почему ты бы так поступил?
  • 0
    @Victor: Просто использовать максимально возможную память ...?
Показать ещё 6 комментариев
Теги:
memory
memory-management

2 ответа

0

Вы можете получить доступ к 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

  • 0
    Это его приложение, поэтому он может захотеть использовать / LARGEADDRESSAWARE напрямую в качестве опции компоновщика.
0

Менеджер программы не оставляет места для вашего стека и других данных. Вы можете вызвать malloc и new, пока они не вернут 0 (NULL). Я думаю, что рабочий набор - это переменная, которую вы должны контролировать.

  • 0
    При выделении 2 ГБ я заметил, что мое приложение становится нестабильным и выдает ошибки «переполнения стека». Также «Рабочий набор» - это выделение, выделенное физической памяти, и это может быть больше уже выделенной памяти, которая могла бы быть выгружена на диск.
  • 0
    Вы можете позвонить Malloc, и я думаю, что не работает вместе
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню