Слайд 1Особенности использования памяти в языке С++
Классы памяти
Выполнила студентка группы ИС-16-01
Асрарова
Луиза
Проверила
Коваленко М.В.
Слайд 2В C++ имеется четыре спецификатора класса памяти: auto, register,
extern и static.
Класс памяти идентификатора определяет
период времени, в течение
которого этот идентификатор существует в памяти.
Слайд 3Категории классов памяти
Спецификаторы класса памяти могут быть разбиты на два
класса:
автоматический класс памяти
статический класс памяти
Слайд 4 Для объявления переменных автоматического класса памяти используются ключевые слова auto
и register. Такие переменные
создаются при входе в блок, в котором они объявлены, существуют, пока
блок активен, и уничтожаются, когда программа
выходит из блока.
Ключевые слова extern и static объявляют идентификаторы для переменных статического класса памяти и для функций. Переменные статического класса памяти существуют с момента, когда программа начинает исполняться, и сохраняются в течение всего периода ее выполнения. Память для переменной статического класса памяти выделяется в начале исполнения
программы.
Слайд 6Спецификаторы:
Auto – авто выделяемая локальная память. Спецификатор может быть задан
для объектов, определённых внутри блока (в теле функции, внутри блока
for, внутри класса). Этим объектом класса auto память выделяется при входе в блок и уничтожается при выходе.
for (int i=0, i<10, i++0
{cout << i;}
cout << i, //ошибка
Register – авто выделяемая локальная регистровая память. Используются регистры, а не участки основной памяти. Если по какой-либо причине в момент начала выполнения кода в данном блоке операторов регистры оказываются занятыми, транслятор обеспечивает с этими объектами обращение, как с объектами класса auto.
Слайд 7 Static – В C++ этот спецификатор имеет два значения.
Первое означает, что определяемый объект располагается по фиксированному адресу. Тем
самым обеспечивается существование объекта с момента его определения до конца выполнения программы. Второе значение означает локальность. Объявленный со спецификатором static локален в одном программном модуле (то есть, недоступен из других модулей многомодульной программы) или в классе. Может использоваться в объявлениях вне блоков и функций. Также используется в объявлениях, расположенных в теле функций и в блоках операторов.
Extern – глобальные объекты, определенные до или после блока main, доступны во всех модулях программы. Присваивается всем функциям, структурам, объединениям и классам. Спецификатор внешнего статического класса памяти.
Слайд 9 В С работать с динамической памятью можно при помощи соответствующих
функций распределения памяти (calloc, malloc, free), для чего необходимо подключить библиотеку
#include
С++ использует
новые методы работы с динамической памятью при помощи операторов new и delete:
new — для выделения памяти;
delete — для освобождения памяти.
Оператор new используется в следующих формах:
new тип; // для переменных
new тип[размер]; // для массивов
Память может быть распределена для одного объекта или для массива любого типа, в том числе типа, определенного пользователем. Результатом выполнения операции new будет указатель на отведенную память, или нулевой указатель в случае ошибки.
Слайд 10int *ptr_i;
double *ptr_d;
struct person *human;
...
ptr_i = new int;
ptr_d = new double[10];
human = new struct person;
Память, отведенная в
результате выполнения new, будет считаться распределенной до тех пор, пока не
будет выполнена операция delete.
Освобождение памяти связано с тем, как выделялась память – для одного элемента или для нескольких. В соответствии с этим существует и две формы применения delete:
delete указатель; // для одного элемента
delete[] указатель; // для массива
Слайд 11 Например, для приведенного выше случая, освободить память необходимо следующим образом:
delete ptr_i;
delete[]
ptr_d;
delete human;
Освобождаться с помощью delete может только память, выделенная оператором new.
Слайд 12Пример Создание динамического массива
#include
using namespace std;
int main() {
int size;
int *dan;
system("chcp 1251");
system("cls");
cout size;
dan = new
int[size];
for (int i=0; i cout << "dan[" << i << "]= ";
cin >> dan[i];
}
for (int i=0; i cout << dan[i] << " ";
delete[] dan;
cin.get(); cin.get();
return 0;
}
Слайд 13 Указатель dan – базовый адрес динамически распределяемого массива, число элементов которого равно size.
Операцией delete освобождается память, распределенная при помощи new.