Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
Практическая работа №9. Динамическое распределение памяти (операторы new, delete).
1. Цель работы:
Ввести понятие динамического распределения памяти в стиле C++.
Статический и динамический. Терминология - статический/динамический характеризует изменение свойств объекта во время работы программы. Если эти свойства не меняются (жестко задаются при трансляции), то они статические, если меняются -динамические. То же касается и существования самих объектов.
Статический - объект, создаваемый при трансляции, динамический - при выполнении программы. По отношению к переменным это выглядит так: если переменная создается при трансляции (а с созданием переменной прежде всего связано распределение памяти под нее), то ее можно назвать статической, если же создается во время работы программы, - то динамической. С этой точки зрения все обычные (именованные) переменные являются статическими.
Основной недостаток обычных переменных - это их фиксированная размерность, которая определяется при трансляции (операция sizeof возвращает для них константу). Количество переменных в программе также ограничено (за исключением случая рекурсивного вызова функции). Но при написании многих программ заранее неизвестна размерность обрабатываемых данных. При использовании обычных переменных в таких случаях возможен единственный выход - определять размерность «по максимуму». В ситуации, когда требуется обработать данные еще большей размерности, необходимо внести изменения в текст программы и перетранслировать ее. Для таких целей используется команда препроцессора #define с тем, чтобы не менять значение одной и той же константы в нескольких местах программы.
#define SZ 1000
int A[SZ];
Динамические переменные. На уровне библиотек в Си имеется механизм создания и уничтожения переменных работающей программой. Такие переменные называются динамическими, а область памяти, в которой они создаются - динамической памятью, или «кучей» (см. рис). «Куча» представляет собой дополнительную область памяти по отношению к той, которую занимает программа в момент загрузки - сегменты команд, глобальных (статических) данных и локальных переменных (стека).
Операторы управления динамической памятью. Операторы new и delete используют при работе обозначения абстрактных типов данных для создаваемых переменных:
при создании динамической переменной в операторе new указывается ее тип, сам оператор имеет тип результата - указатель на создаваемый тип, а значение - адрес созданной переменной или массива;
если выделяется память под массив динамических переменных, то в операторе new добавляются квадратные скобки;
оператор delete получает указатель на уничтожаемую переменную или массив.
Основные свойства динамических переменных:
динамические переменные создаются и уничтожаются работающей программой путем выполнения специальных операторов или вызовов функций;
количество и размерность динамических переменных могут меняться в процессе работы программы и зависят от количества вызовов соответствующих функций и передаваемых при вызове параметров;
динамическая переменная не имеет имени, доступ к ней возможен только через указатель;
при выполнении функции создания динамической переменной в «куче» выделяется свободная память необходимого размера и возвращается указатель на нее (адрес);
функция уничтожения динамической переменной получает указатель на уничтожаемую переменную.
Самые важные свойства динамических переменных - это их «безымянность» и доступность по указателю, чем и определяется возможность варьировать число таких переменных в программе. Из этого можно сделать следующие выводы:
если динамическая переменная создана, а указатель на нее «потерян» программой, то такая переменная представляет собой «вещь в себе» - существует, но недоступна для использования;
динамическая переменная может, в свою очередь, содержать один или несколько указателей на другие динамические переменные. В этом случае мы получаем динамические структуры данных, в которых количество переменных и связи между ними могут меняться в процессе работы программы (списки, деревья, виртуальные массивы);
управление динамической памятью построено обычно таким образом, что ответственность за корректное использование указателей на динамические переменные несет программа (точнее, программист, написавший ее). Ошибки в процессе создания, уничтожения и работы с динамическими переменными (повторная попытка уничтожения динамической переменной, попытка уничтожения переменной, не являющейся динамической, и т.д.), трудно обнаруживаются и приводят к непредсказуемым последствиям в работе программы.
//gl3стиль С++
#include <iostream.h>
#include <conio.h>
int main (void) {clrscr(); int i;
double *pd;
pd = new double; // Обычная динамическая переменная
*pd = 5;
cout<<"\n"<<*pd<<"\n"; delete pd; /*}*/
double *pdm; // Массив динамических переменных
pdm = new double[10];
for (i=0; i<10; i++)
{pdm[i]=i; cout<<"\n"<<pdm[i];}
delete []pdm;
getch(); return 0;}
Изменить программу размер динамического массива определяется пользователем во время работы программы.
Провести эксперимент по аналогии с программой из практической работы №8 выделить объем памяти под десять целочисленных переменных, не являющихся массивом (int*10).
Провести эксперимент по аналогии с программой из практической работы №8 проанализировать результат выделения памяти (равенство указателя нулю).
PAGE 1