Является ли результат размещения в куче зависимым от результата размещения в стеке? - PullRequest
0 голосов
/ 21 февраля 2019

Давайте рассмотрим этот код:

static const size_t DATA_SIZE = 100000;

void log_msg(const char* msg)
{
  char msg_buffer[DATA_SIZE];
  // Do something...
}

int main()
{
  // Do something heap-memory consuming...

  unsigned char buffer = new unsigned char[DATA_SIZE];
  if(!buffer)
  {
    log_msg("Insufficient memory!");
    return 1;
  }

  // Go ahead...

  delete[] buffer;

  return 0;
}

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

Мой вопрос довольно прост: будет ли ВСЕГДА ошибочным выделение в стеке для msg_buffer, если выделение для buffer в куче ошибочно?

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

Если нет никаких независимых от платформы утверждений, касающихся этого, тогда я мог бы знать, существуют ли такие для случая Linux для архитектуры x86.

1 Ответ

0 голосов
/ 21 февраля 2019

Это явно зависит от реализации.Кстати, простое понятие стека и кучи не существует в стандарте, даже если они распространены в реальной реализации.

Я могу вспомнить старые добрые системы MS / DOS, где типы распределения могли зависеть от модель памяти .Некоторые компиляторы использовали один единственный сегмент (SS) в малых и средних моделях как для стека, так и для кучи, стек растет с одного конца, а кучи - с другого, но использовали распределение из памяти над программой (поэтому не зависит от стека)для компактных и больших моделей.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...