Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Лекция 9. Динамическое распределение памяти в языке С++

Динамическое распределение памяти в языке С++

 

Различают статическое и динамическое распределение памяти компьютера под объекты.

 

Статическое распределение предполагает, что память для размещения объектов выделяется в процессе компиляции программ. Иначе говоря, компилятор создает объекты, выделяя для них память на основании соответствующих определений.

Например, определение переменной int array[10]; свидетельствует о том, что в программе вводится массив, который требует память для размещения десяти элементов целого типа. Компилятор каждому имени объекта ставит в соответствие адрес. В связи с этим, доступ к статическим объектам реализуется по именам.

Компилятор не может выделять память под объекты с динамической структурой данных, поскольку их структура, а,следовательно, и объем памяти могут меняться в процессе выполнения программы. Память под такие объекты выделяется на этапе выполнения программы. Поскольку на этапе компиляции программы адреса динамических объектов не известны, то доступ к ним организуется не по именам, а через указатели.

Каждой программе компьютер выделяет память, состоящую из четырех секций:

1. программная секция, включающая код программы;

2. секция данных, содержащая внутренние представления статических объектов;

3. стек – область памяти, используемая при реализации функций;

4. динамическая память (ДП), предоставляемая программе при ее выполнении.

Создание динамического объекта осуществляется в два этапа

1 этап. Резервирование места в ДП под объект и формирование значения указателя, ссылающегося на это объект.

2 этап. Запись значения объекта в ДП по указанному адресу.

Для выделения ДП под объект служит оператор new.

Синтаксис этого оператора:

<имя указателя>=new <тип >;

 

Оператор new выделяет в ДП место под значение заданного типа и возвращает адрес этой области. Например:

 

float *p;

p=new float;

 

После того, как указатель приобрел конкретное значение, по этому адресу можно разместить значение соответствующего типа. Например:

 

*p=15.46;

 

Для освобождения ДП используется оператор delete:

 

delete <имя указателя>;

Оператор delete освобождает память, ранее связанную с указателем. Например:

 

delete p;

 

В операторе delete необходимо использовать только тот указатель, который был определен в операторе new.

При использовании оператора new можно инициализировать значение объекта:

 

<имя указателя>= new <тип>(<инициализатор>);

 

Здесь тип инициализатора должен быть совместимым с типом объекта, для которого выделяется память.

Например:

 

void main()

{ int *p;

p=new int(250);

cout<< *p<<”\n”;

delete p;

}

 

С помощью оператора new можно выделять память под массивы:

 

<имя указателя>= new <тип элемента массива>[<размер>];

 

Здесь <размер>- количество элементов в массиве.

Для освобождения ДП, выделенной под массив, можно использовать оператор delete следующего формата:

 

delete []<имя указателя>;

 

Пример. Создать в ДП массив из 10 целых чисел, вывести его на экран и освободить ДП.

 

void main()

{ int *p, i;

p=new int[10];

for(i=0; i<10; i++)

p[i]=i;

for(i=0; i<10; i++)

cout<< p[i]<<” “;

cout<<”\n”;

delete[] p;

}

 

Используя операторы new и delete можно выделять ДП под экземпляры классов и освобождать ее.

При размещении объекта в ДП с помощью оператора new вызывается конструктор, а при освобождении ДП вызывается деструктор.

Пример. Разместить объект класса “прямоугольник” в ДП, вычислить площадь прямоугольника и освободить ДП.

 

#include <iostream.h>

class Rectangle

{ int width, height;

public:

Rectangle(int w, int h)//конструктор

{width=w; height=h;

cout<<”Создание прямоугольника.\n”;

}

~ Rectangle()//деструктор

{cout<<”Разрушение прямоугольника.\n”;

}

int area()

{return width * height;

}

};

void main()

{ Rectangle *p;

p= new Rectangle(10,8);

cout<<”Площадь=”<<p->area()<<”.\n”;

delete p;//вызов деструктора

}

 

 

Результат:

Cоздание прямоугольника.

Площадь=80.

Разрушение прямоугольника.

 

Динамические структуры данных

 

ДП широко используется для хранения динамических структур данных (ДСД). К ДСД относят списки, стеки, очереди и деревья.

Рассмотрим списки. Различают линейные и циклические, однонаправленные и двунаправленные, упорядоченные и неупорядоченные списки.

 

Линейный однонаправленный список (ЛОС)

 

ЛОС – это ДСД, каждый элемент которой включает информационное поле и указатель на следующий элемент. Поле указателя последнего элемента ЛОС имеет значение NULL (пустой указатель). Информационное поле содержит ключ, идентифицирующий элемент, и,возможно любую другую информацию.

На языке С++ элемент ЛОС можно описать в виде класса.

Например:

 

class list

{public:

char name[80];//имя

int year;//год рождения

list *next;//указатель на следующий элемент списка

void create();//создание списка

void output();//вывод на экран элементов списка

};

 

<== предыдущая лекция | следующая лекция ==>
Модель Митчелла | И способах изготовления червячных зацеплений
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 374; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.014 сек.