Язык C ++ поддерживает два вида выделения памяти через переменные в программах на C ++:
Статическое распределение - это то, что происходит, когда вы объявляете статическую или глобальную переменную. Каждая статическая или глобальная переменная определяет один блок пространства фиксированного размера. Пространство выделяется один раз, когда ваша программа запускается (часть операции exec), и никогда не освобождается.
Автоматическое распределение происходит, когда вы объявляете автоматическую переменную, такую как аргумент функции или локальная переменная. Пространство для автоматической переменной выделяется при вводе составного оператора, содержащего объявление, и освобождается при выходе из этого составного оператора. Размер автоматического хранилища может быть выражением, которое варьируется. В других реализациях CPP это должна быть константа.
Третий важный тип выделения памяти, динамическое распределение, не поддерживается переменными C ++, но доступен для функций библиотеки.
Динамическое выделение памяти
Динамическое распределение памяти - это метод, при котором программы во время работы определяют, где хранить некоторую информацию. Динамическое распределение требуется, когда объем памяти, который вам нужен, или длительность, в которой вы продолжаете в ней нуждаться, зависят от факторов, которые неизвестны до запуска программы.
Например, вам может понадобиться блок для хранения строки, прочитанной из входного файла; Так как длина строки не ограничена, вы должны динамически выделять память и динамически увеличивать ее по мере чтения строки.
Или вам может понадобиться блок для каждой записи или каждого определения во входных данных; так как вы не можете заранее знать, сколько их будет, вы должны выделить новый блок для каждой записи или определения, когда вы читаете его.
Когда вы используете динамическое распределение, выделение блока памяти - это действие, которое программа явно запрашивает. Вы вызываете функцию или макрос, когда хотите выделить место, и указываете размер с помощью аргумента. Если вы хотите освободить место, вы делаете это, вызывая другую функцию или макрос. Вы можете делать это когда угодно, так часто, как захотите.
Динамическое распределение не поддерживается переменными CPP; отсутствует класс хранения «динамический», и никогда не может быть переменной CPP, значение которой хранится в динамически выделенном пространстве. Единственный способ получить динамически распределенную память - это системный вызов, а единственный способ обратиться к динамически распределенному пространству - через указатель. Поскольку это менее удобно, а фактический процесс динамического выделения требует большего времени вычислений, программисты обычно используют динамическое распределение только тогда, когда ни статическое, ни автоматическое распределение не будут служить.
Например, если вы хотите динамически выделить некоторое пространство для хранения struct foobar, вы не можете объявить переменную типа struct foobar, содержимое которой является динамически выделяемым пространством. Но вы можете объявить переменную типа указателя struct foobar * и присвоить ей адрес пробела. Затем вы можете использовать операторы ‘*’ и ‘->’ в этой переменной указателя для ссылки на содержимое пробела:
{
struct foobar *ptr
= (struct foobar *) malloc (sizeof (struct foobar));
ptr->name = x;
ptr->next = current_foobar;
current_foobar = ptr;
}