Что произойдет, если у моего приложения недостаточно памяти? - PullRequest
1 голос
/ 25 апреля 2009

Если моему приложению не хватает памяти, когда я вызываю new (), я получаю исключение, а malloc () я получаю 0 указатель.

Но что если я вызову метод с некоторыми локальными переменными? Они тоже занимают память. Есть ли способ зарезервировать память для "нормальных" переменных? Так что, хотя new () выдает исключение, я могу его просто перехватить, исправить и по-прежнему вызывать методы, как обычно.

Ответы [ 4 ]

6 голосов
/ 25 апреля 2009

Ваши данные распределяются одним из трех способов:

  • Статически распределенные данные (статические члены или глобальные переменные) распределяются при запуске приложения, что означает, что они на самом деле не будут проблемой.
  • Данные, выделенные стеком, выделяются в стеке (удивительно!) Стек - это область памяти, выделенная для локальных переменных и фреймов стека функций. Если вам не хватает места, неизвестно, что произойдет. Некоторые реализации могут обнаружить его и вызвать ошибку нарушения доступа / сегментации, а другие просто заставят вас перезаписать данные кучи. В любом случае, нет способа обнаружить это, потому что в общем случае нет способа справиться с этим. Если вам не хватает места в стеке, вы ничего не можете сделать. Вы даже не можете вызвать функцию, потому что она занимает место в стеке.
  • Память, выделенная для кучи, - это то, что вы используете, когда вызываете new / malloc. Здесь у вас есть механизм для обнаружения ситуаций нехватки памяти, потому что вы можете быть в состоянии справиться с этим. (Вместо 200 МБ вы можете обойтись 100 МБ и просто поменять данные на полпути)

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

3 голосов
/ 25 апреля 2009

Язык C ++ не предоставляет никакого механизма для резервирования памяти для локальных переменных. Ваша конкретная реализация C / и / или операционная система может предоставить некоторые средства для увеличения общего размера стека, но это обычно не требуется.

Обратите внимание также, что если вызов new не удался, то, вероятно, вы практически ничего не сможете сделать для его восстановления. Многие люди (включая меня) больше не беспокоятся о поиске новых ошибок.

1 голос
/ 25 апреля 2009

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

Стандарт имеет интересное приложение под названием Количества реализации . Это ненормативный (информативный) и, следовательно, не должны рассматриваться как абсолютная истина, но дает вам справедливую идею.

1 голос
/ 25 апреля 2009

New выделяет память из кучи, но локальные переменные обычно находятся в стеке - что может переполниться, но менее вероятно, в зависимости от вашей платформы. Можете ли вы предоставить более подробную информацию?

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