А может, проще?
1. new, malloc, calloc, std::make_shared — всегда куча.
2. Простая переменная, массив a[n] (в том числе динамическое int a[n] из C99) — стек или сегмент данных.
а) Локальная переменная — стек.
б) Остальное (static, за пределами функции) — сегмент данных.
3. В составе struct/class: если переменная в теле, применяем эти же правила к телу конкретного объекта. Если выделена через new — в куче. Если получена по указателю/ссылке — ищем, откуда взялся указатель/ссылка и применяем эти же правила.
а) Структура заранее неопределённого или динамического размера — скорее всего, куча.
б) std::vector, list, deque, string и прочие — куча. std::array — тело.
в) std::unique_ptr — куча (т.к. инициализируется операцией new).
г) std::shared_ptr — зависит от того, чем инициализируешь. Обычно make_shared (т.е. куча), но можно присвоить ему неуправляемый указатель, и такой объект может быть где угодно.
Pantene742:
Виртуальная память, если адресное пространство хотя бы вдвое больше, чем реально есть оперативы, надолго отсрочивает тот момент, когда фрагментация станет опасной.
Pantene742:
> А вот такая тема. например мы создаем переменную "A" INT со значением 5.
Обычно она создаётся на стеке, который невелик (единицы мегабайт) и по определению не фрагментируется.