Динамические данные используются для выделения памяти во время работы программы. Выделение памяти в процессе выполнения программы проводится с помощью оператора new, которому сообщается тип создаваемых данных, оператор new возвращает указатель на выделенную им область памяти.
Переменные размещаются в двух местах. Первое называется статической памятью (static memory) или стеком (stack), а второе – свободной памятью (free store) или кучей(heap).
Программа представляет собой последовательность инструкций или операторов, микропроцессор строка за строкой считывает и исполняет каждый оператор. Иногда программе необходимо выполнить промежуточный шаг, чтобы вернуться обратно к выполнявшейся работе надо запомнить, где была программа и какие действия выполняла. Это запоминание осуществляется с помощью стека. Когда программа готова вернуться к прерванной работе она считывает информацию из стека. Другое назначение стека - обеспечить удобное место для хранения переменных, определённых внутри функций – локальных переменных. Таким переменным память нужна только на время работы функций. Дальше они извлекаются из стека, открывая программе доступ к информации, необходимой для возврата в точку, где она была прервана. Однако стек не безграничен, избыток глобальных переменных серьёзно усложняет программу, при компиляции размещается в сегменте данных, который не бездонный. Обычно самый большой блок доступной памяти – это куча. Как правило, это всё, что остаётся после выделения памяти под сегмент стека, сегмент данных и сегмент кода.
Куча используется для размещения переменных, когда вы сами управляете их созданием и уничтожением, или когда размер необходимой вам области памяти превосходит объём доступной памяти в стеке, или когда вам требуется и то и другое. Объекты размещаются в куче посредством объявления указателя и запроса на область памяти операцией new. Если вызов операции new был успешным, она возвращает указатель на переменную.
int *intPointer; // объявление указателя на целое
intPointer=new int; // инициализация указателя
Чтобы выделить память под массив из ста вещественных чисел, надо записать float *pfloat=new float[100];
Для освобождения выделенной памяти предусмотрена операция delete , если память не освободить, то система не сможет забрать её обратно.
Форма вызова операции delete должна соответствовать форме вызова соответствующей операции new .