Вы спрашиваете, можете ли вы узнать, прежде чем вызывать malloc, сколько байтов доступно для использования?
Если так, ответ - нет. Даже если бы вы могли, ответ может быть не очень ценным для вас. Причина в том, что вы никогда не можете знать, сколько памяти доступно, вы можете знать только, сколько памяти было доступно . Это очень важное различие, потому что оно влияет на то, как вы можете правильно использовать API.
Например, давайте предположим, что была такая функция с именем available_memory. Этот код выглядит правильно, но ужасно сломан
size_t size = GetSizeToAllocate();
if ( size < available_memory() ) {
// No need to check the answer because there is enough memory
SomeType* p = malloc(size);
}
Причина в том, что какой-то другой поток может находиться между оператором if и оператором malloc и выполнять свое собственное распределение. Это может уменьшить общую память в системе и, следовательно, изменить возвращение available_memory.
Еще хуже то, что доступный объем памяти в системе не определяет, сколько памяти можно выделить с помощью malloc. Для malloc (и любой другой операции выделения памяти) важно, сколько непрерывной памяти доступно.