Вопрос С++ STL: распределители

У меня есть (потенциально тупой) вопрос о С++ STL. Когда я создаю контейнер (вектор, набор, карту и т.д.), Он выделяется в стеке или в куче? Если я создам набор и поставлю 5 миллионов строк, мне придется беспокоиться о переполнении стека?

Ответы

Ответ 1

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

Ответ 2

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

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

Ответ 3

Сам контейнер выделяется там, где вы решаете (это может быть стек, куча, член объекта и т.д.), но используемая память по умолчанию, как описано другими, взята в Free Store (управляется через новые и удалить), который не совпадает с кучей (управляется через malloc/free).

Не смешивайте два!