А может, проще?
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.
Обычно она создаётся на стеке, который невелик (единицы мегабайт) и по определению не фрагментируется.
Да, Program — интерфейс (класс из одних абстрактных функций, возможно, с пустым виртуальным деструктором). Одна функция — exec, которая и реализована в Ls, Cp и т.д. Может, ещё name() — это уже как реализуешь поиск.
Command — совершенно верно.
Console — консоль (из-за того, что эти консоли вечно приходится перенаправлять, выделил в отдельный класс).
А System — это всё остальное, что я пока не конкретизировал — файловая система, переменные окружения, текущий каталог…
Тут даже «одиночки» не нужны, просто создать статически. Почему? — 1) из данных там, скорее всего, только виртуальная таблица да имя; 2) нужна же функциональность поиска программы по имени.
Неверно пользуешься malloc’ом. И код, поскольку не забран в тэг, не выводится полностью.
int * arrayPtr = (int*) calloc(size,sizeof(int));
В принципе, верно — если оно проявляется на небольших буферах.