Читать книгу Ссылки и указатели в C++: от основ к безопасности и современному коду - - Страница 2

Где что живёт стек, куча, статика и другие сегменты памяти

Оглавление

В C++ память делится на несколько сегментов, каждый из которых предназначен для хранения данных с разными сроками жизни, правилами доступа и механизмами управления. Это как комнаты в огромном доме: кухня для быстрых дел (стек), подвал для долгосрочного хранения (куча), фундамент для постоянных элементов (статика), библиотека для неизменных книг (константная память) и чертежи дома (сегмент кода). Понимание этих сегментов ключ к избежанию ошибок, как крахи или утечки.

Стек (Stack): это область для локальных переменных функций, параметров и информации о вызовах (стек вызовов). Работает по принципу LIFO (Last In, First Out) как стопка тарелок: последняя положенная снимается первой. Размер стека фиксирован и ограничен (обычно 1–8 МБ на поток), выделяется автоматически при входе в функцию и освобождается при выходе. Это делает стек сверхбыстрым, но не подходящим для больших или динамических данных рискуете переполнением (stack overflow). Локальные переменные "живут" только внутри функции.

Куча (Heap): здесь память выделяется динамически во время выполнения программы с помощью операторов вроде new или функций вроде malloc. Куча огромна (ограничена только доступной RAM и виртуальной памятью ОС), но управление ею лежит на программисте: вы сами выделяете и освобождаете память (delete или free). Это идеально для объектов, размер которых неизвестен заранее, как растущие массивы, деревья или списки. Однако забыв освободить и привет, утечка памяти, когда программа "съедает" всё больше RAM.

Статическая память (Static/Global): это сегмент для глобальных переменных, статических локальных переменных (объявленных с static) и констант. Они "живут" весь срок жизни программы: выделяются при запуске (в сегментах data или bss) и освобождаются автоматически при завершении. Нет нужды в ручном управлении, но они занимают место постоянно, что может быть проблемой в embedded-системах. Глобальные переменные видны везде, статические только в своей области видимости.

Сегмент кода (Text/Code Segment): здесь хранится сам исполняемый код программы инструкции процессора. Это read-only область: вы не можете модифицировать код во время выполнения (за исключением редких случаев, как JIT-компиляция). Константы строк вроде "Hello" часто живут здесь или в read-only data.

Константная память (Read-Only Data): Подмножество статики для неизменяемых данных, как строковые литералы или const глобальные. ОС защищает её от записи, чтобы предотвратить ошибки.

Ссылки и указатели в C++: от основ к безопасности и современному коду

Подняться наверх