При динамическом распределении некоторых объектов или переменных в C++ (я использую Windows 7).. есть ли способ узнать, сколько памяти (в байтах) доступно для нас, чтобы мы могли использовать, чтобы предотвратить крах? Кроме того, я хотел бы знать, зависит ли это от ОС? Если да, то какая разница, например, между окнами и другой широко используемой ОС?
Вы не можете легко узнать, сколько свободной памяти есть. Даже концепция свободной памяти неясна, поскольку ОС может предлагать виртуальную память с дисковой поддержкой. По сути, на современных персональных компьютерах и проблемах, основная проблема не исчерпывается памятью, но заканчивается быстрой памятью, попадает в режим с большой файловой активностью и действительно замедляет работу.
Если сбой динамического распределения памяти в C++, вы получаете исключение std::bad_alloc
.
Вы можете установить так называемый new-handler, чтобы справиться с ситуацией с отсутствием памяти. Он может регистрировать что-то и терпеть неудачу, или, возможно, освободить некоторую память от кризисного фонда (так сказать). В некоторых случаях это может привести к выходу контролируемой программы.
Даже если вы обнаружите, что во время проверочного звонка было бы доступно много памяти, к тому времени, когда вы доберетесь до своего распределения, какой-то другой процесс или поток в вашем процессе, возможно, исчерпали большую часть этого, так что распределение все еще не работает,
Таким образом, вам нужно либо быть готовым к сбою в распределении, либо разработать для столь разумного потребления памяти, что вы чувствуете себя в безопасности, просто игнорируя проблему.
Таким образом, ответ на ваш вопрос...
"есть ли способ узнать, сколько памяти (в байтах) доступно для нас, чтобы мы могли предотвратить крах?"
"нет" - сбой (предположительно из-за отсутствия обработки исключения bad_alloc
) не может быть предотвращен путем предварительной проверки доступной памяти.
new
может быть больше или меньше, даже если после контрольного вызова все осталось на месте. Это связано с тем, что (1) он выполняет перераспределение, при котором у перераспределителя может быть много свободной памяти, и (2) он выполняет перераспределение (да, опять же), который имеет некоторые накладные расходы, используя память для управления памятью.
VirtualAlloc
не резервирует оперативную память, он резервирует адресное пространство . Зафиксировать это позже может не получиться.
Это зависит не от ОС, а от архитектуры процессора. Объем памяти, доступной для процесса, определяется количеством выводов адреса, доступных в процессоре.
Если вы собираетесь выделить смежное пространство, скажем, массив, который может быть более сложным и может быть доступно меньшее количество ячеек.
Лучшим подходом было бы допущение ошибки. malloc
возвращает NULL
в случае отсутствия доступной памяти/ошибки. Убедитесь, что в этом случае необходимо выполнить необходимое восстановление.