Какой объем памяти свободен для нас, чтобы использовать его (C ++, Windows 7)

0

При динамическом распределении некоторых объектов или переменных в C++ (я использую Windows 7).. есть ли способ узнать, сколько памяти (в байтах) доступно для нас, чтобы мы могли использовать, чтобы предотвратить крах? Кроме того, я хотел бы знать, зависит ли это от ОС? Если да, то какая разница, например, между окнами и другой широко используемой ОС?

  • 1
    Неспособность выделить память не приводит к сбою. Неспособность правильно обработать эту ошибку вызывает сбой.
Теги:
memory-management

2 ответа

1
Лучший ответ

Вы не можете легко узнать, сколько свободной памяти есть. Даже концепция свободной памяти неясна, поскольку ОС может предлагать виртуальную память с дисковой поддержкой. По сути, на современных персональных компьютерах и проблемах, основная проблема не исчерпывается памятью, но заканчивается быстрой памятью, попадает в режим с большой файловой активностью и действительно замедляет работу.

Если сбой динамического распределения памяти в C++, вы получаете исключение std::bad_alloc.

Вы можете установить так называемый new-handler, чтобы справиться с ситуацией с отсутствием памяти. Он может регистрировать что-то и терпеть неудачу, или, возможно, освободить некоторую память от кризисного фонда (так сказать). В некоторых случаях это может привести к выходу контролируемой программы.


Даже если вы обнаружите, что во время проверочного звонка было бы доступно много памяти, к тому времени, когда вы доберетесь до своего распределения, какой-то другой процесс или поток в вашем процессе, возможно, исчерпали большую часть этого, так что распределение все еще не работает,

Таким образом, вам нужно либо быть готовым к сбою в распределении, либо разработать для столь разумного потребления памяти, что вы чувствуете себя в безопасности, просто игнорируя проблему.


Таким образом, ответ на ваш вопрос...

"есть ли способ узнать, сколько памяти (в байтах) доступно для нас, чтобы мы могли предотвратить крах?"

"нет" - сбой (предположительно из-за отсутствия обработки исключения bad_alloc) не может быть предотвращен путем предварительной проверки доступной памяти.

  • 0
    @Mgetz: да, вы можете использовать эту информацию, чтобы не нагружать систему. но бесполезно использовать его, чтобы гарантировать, что какое-то распределение будет успешным. потому что информация устарела, устарела уже тогда, когда вы ее получаете. Кроме того, свободная память, доступная через C ++ new может быть больше или меньше, даже если после контрольного вызова все осталось на месте. Это связано с тем, что (1) он выполняет перераспределение, при котором у перераспределителя может быть много свободной памяти, и (2) он выполняет перераспределение (да, опять же), который имеет некоторые накладные расходы, используя память для управления памятью.
  • 0
    @Mgetz: VirtualAlloc не резервирует оперативную память, он резервирует адресное пространство . Зафиксировать это позже может не получиться.
Показать ещё 7 комментариев
1

Это зависит не от ОС, а от архитектуры процессора. Объем памяти, доступной для процесса, определяется количеством выводов адреса, доступных в процессоре.

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

Лучшим подходом было бы допущение ошибки. malloc возвращает NULL в случае отсутствия доступной памяти/ошибки. Убедитесь, что в этом случае необходимо выполнить необходимое восстановление.

  • 0
    Это также зависит от ОС и некоторых настроек. В Windows 32 бит, если вы не можете «LARGEADDRESSAWARE», ваш процесс может выделить только 2 ГБ. С "LARGEADDRESSAWARE" вы можете перейти на 3Gb. Процесс 32b на Windows 64 может идти до 2g без учета большого адреса и до 4G с.
  • 1
    Это явно не соответствует ряду аспектов. На моей старой машине с Win95 моим процессам стало доступно больше памяти, как только я установил 32 МБ ОЗУ, но я не изменил количество контактов адреса, доступных в процессоре. Также ОС действительно имеет значение. Даже 32-разрядный процесс _ может) выиграть от дополнительного адресного пространства при загрузке между (скажем) 32-разрядной и 64-разрядной версией Windows XP.

Ещё вопросы

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