Есть ли способ узнать, какое максимальное количество байтов доступно при использовании malloc в c? - PullRequest
1 голос
/ 27 марта 2009

Или вам просто нужно сделать это и проверить errno и / или указатель, чтобы увидеть, добились ли вы успеха?

Ответы [ 4 ]

14 голосов
/ 27 марта 2009

Вы спрашиваете, можете ли вы узнать, прежде чем вызывать 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 (и любой другой операции выделения памяти) важно, сколько непрерывной памяти доступно.

6 голосов
/ 27 марта 2009

Попытка не обязательно поможет, потому что некоторые операционные системы (например, Linux) используют оптимистичную стратегию выделения памяти - даже если вы получаете ненулевой результат из malloc(), это не означает, что у вас есть запрошенный кусок памяти в вашем сервис.

Подробнее здесь

Кажется, нет способа сделать это.

1 голос
/ 27 марта 2009

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

1 голос
/ 27 марта 2009

Нет способа сделать это в C. Любое решение будет зависеть от ОС, и я не знаю, будет ли оно достаточно полезным для реализации.

...