Распределение стека завершается неудачно, а выделение кучи завершается успешно !!Является ли это возможным? - PullRequest
5 голосов
/ 22 апреля 2010

У меня есть следующий фрагмент кода

Class Sample
{ Obj_Class1 o1;
  Obj_Class2 o2;};

Но размеры Obj_Class1 и Obj_Class2 огромны, так что компилятор выдает предупреждение «Рассмотрите возможность перемещения некоторого пространства в кучу». Меня попросили заменить Obj_Class1 o1 на Obj_Class1* o1 = new Obj_Class1(); Но я чувствую, что это изменение не имеет смысла, так как распределение кучи также не удастся, если распределение стека завершится неудачно. Я прав? Или имеет смысл внести это изменение (кроме подавления предупреждения компилятора).

Ответы [ 4 ]

5 голосов
/ 22 апреля 2010

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

3 голосов
/ 22 апреля 2010

Стек по умолчанию достаточно мал: http://msdn.microsoft.com/en-us/library/ms686774(VS.85).aspx

Размер по умолчанию для зарезервированной и изначально зафиксированной стековой памяти указывается в заголовке исполняемого файла. Создание потока или волокна завершается неудачно, если недостаточно памяти для резервирования или фиксации количества запрошенных байтов. Размер резервирования стека по умолчанию, используемый компоновщиком, составляет 1 МБ. Чтобы указать другой размер резервирования стека по умолчанию для всех потоков и волокон, используйте оператор STACKSIZE в файле определения модуля (.def). Операционная система округляет указанный размер до ближайшего кратного гранулярности распределения системы (обычно 64 КБ). Чтобы получить детализацию распределения текущей системы, используйте функцию GetSystemInfo.

3 голосов
/ 22 апреля 2010

Стек обычно невелик и не подходит для хранения огромных объектов, тогда как куча отдельная и предназначена для них.

В вашем примере вы, вероятно, должны выделить целую Sample в куче, а не ее члены:

int main() {
   Sample* sample = new Sample();
}
2 голосов
/ 22 апреля 2010

В случае Visual Studio каждый поток по умолчанию получает 1 МБ пространства, и если вы попытаетесь выделить больше, вы получите ошибку переполнения стека.Кучи не имеет этого ограничения, и объем памяти, который вы можете выделить, зависит от самого большого непрерывного пространства, доступного в виртуальной памяти вашего процесса.Поэтому неудивительно, что выделение стека завершается неудачей, если объекты действительно огромны.

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