- •Предисловие
- •Введение
- •Введение в программирование
- •1.1. Предисловие к курсу
- •1.2. Идеология языка
- •1.3. Обзор среды Microsoft Developer Studio
- •1.4. Жизненный цикл программного обеспечения
- •1.5. Общая структура программы
- •1.6. Директивы препроцессора
- •1.7. Построение исполняемого файла
- •1.8. Строительные блоки программы
- •Контрольные вопросы
- •Типы данных. Переменные. Массивы. Операции и Указатели
- •Стандартные типы и размеры данных
- •2.1.1. Объявление переменных
- •Управляющие символьные константы
- •2.2. Объявление указателя
- •2.2.1. Операции разыменования и взятия адреса
- •2.2.2. Указатели на указатели
- •2.2.3. Арифметические операции с указателями
- •2.3. Массивы
- •2.3.1. Инициализация массивов
- •2.3.2 Динамические массивы
- •2.3.3. Методы доступа к элементам массивов
- •2.3.4. Массивы указателей
- •2.4. Строки
- •2.5. Операции
- •2.5.1. Арифметические операции
- •Арифметические операции
- •2.5.2 Операции сравнения и логические операции
- •Операции сравнения и логические операции
- •2.5.3. Побитовые операции
- •Побитовые операции
- •Контрольные вопросы
- •3.1. Базовые операторы
- •3.1.1. Оператор выражение
- •3.2.2. Оператор switch
- •3.3.4. Оператор goto
- •3.4. Операторы цикла
- •3.4.1. Оператор for
- •3.4.2. Оператор while
- •3.4.3. Оператор do..While
- •Контрольные вопросы
- •Стандартный ввод/вывод. Работа с файлами.
- •4.1. Роль стандартного ввода/вывода
- •4.1.1. Основные функции стандартного ввода/вывода
- •4.2. Понятие файла
- •4.2.1. Строение файлов
- •4.2.2. Порядок работы с файлом
- •4.2.3. Обзор библиотечных функций с для работы с файлами
- •4.3. Программные конструкции при работе с файлами
- •4.3.1. Открытие/закрытие файла
- •4.3.2. Цикл посимвольного чтения содержимого файла
- •4.3.3. Цикл построчного чтения содержимого файла
- •Контрольные вопросы
- •Функция. Пользовательские типы данных.
- •5.1. Понятие функции
- •5.1.1. Определение функции
- •5.1.2. Формальные параметры
- •5.1.3. Тип возвращаемого значения
- •5.1.4. Тело функции
- •5.1.5. Фактические параметры
- •5.1.6. Рекурсивные вызовы
- •5.1.7. Передача параметров
- •5.1.8. Библиотеки стандартных функций
- •5.2. Пользовательские типы данных.
- •5.2.1. Ключевое слово typedef
- •5.2.2. Перечислимый тип данных
- •5.2.3. Понятие структуры
- •5.2.4. Указатели на структурный объект
- •Контрольные вопросы
- •Работа с динамической памятью. Динамические структуры данных
- •6.1. Работа с динамической памятью
- •6.1.1. Статическое и динамическое распределение памяти
- •6.1.2. Основные принципы динамического распределения
- •6.1.3. Способы работы с динамической памятью
- •6.2. Динамические структуры данных
- •6.2.1. Стек
- •6.2.2.Линейный список
- •Контрольные вопросы
- •Объектно-ориентированное программирование
- •7.1. Критерии качества декомпозиции проекта
- •7.2. Новые концепции программирования
- •7.3. Достоинства ооп
- •7.4. Объекты и классы в ооп
- •7.4.1. Определение класса
- •7.4.2. Использование класса
- •7.4.3. Вложенные классы
- •Контрольные вопросы
- •Конструкторы и Перегрузка операций.
- •8.1. Перегрузка операций
- •8.1.1. Перегрузка операций внешними функциями
- •8.1.2. Перегрузка операций методами класса
- •8.2. Конструкторы и деструктор
- •8.2.1. Конструкторы и параметры
- •Контрольные вопросы
- •9.1. Простое открытое наследование
- •9.1.1 Конструкторы и деструкторы при наследовании
- •9.1.2. Поля и методы при наследовании
- •9.1.3. Вложенные классы и наследование
- •9.1.4. Закрытое наследование
- •9.1.5. Виртуальные функции
- •9.1.6. Чистые виртуальные функции и абстрактные классы
- •9.3. Основы программирования под Windows
- •9.3.1. Типы данных в Windows
- •9.4. Cреда Microsoft Developer Studio
- •9.4.1. Библиотека mfc
- •9.4.2. Архитектура приложения
- •9.4.3. Каркас приложения
- •9.4.4. Проект приложения
- •Контрольные вопросы
- •Заключение
- •Список Литературы
6.1.2. Основные принципы динамического распределения
памяти
После выделения динамической памяти она сохраняется до ее явного освобождения. Если память не была освобождена до окончательного выполнения программы, то она освобождается автоматически при завершении. Тем не менее явное освобождение ставшей ненужной памяти является признаком хорошего стиля программирования.
В процессе выполнения программы участок динамической памяти доступен везде, где доступен указатель, адресующий этот участок. Таким образом, возможны три варианта работы с динамической памятью, выделяемой в некотором блоке:
- указатель определен как локальный объект. В этом случае динамическая память будет недоступна при выходе за пределы блока и ее нужно освободить перед выходом из блока;
- указатель определен как локальный объект, с ключевым словом static. Динамическая память, выделенная однократно в блоке, доступна через указатель при каждом входе в блок. Память нужно освободить по окончании ее использования;
- указатель является глобальным объектом по отношению к блоку. Динамическая память доступна по всему тексту программы. Память нужно освободить только по окончанию ее использования.
6.1.3. Способы работы с динамической памятью
В С++ существуют два способа работы с динамической памятью: функциональный и операторный. Функциональный способ активно использовался в С, операторный появился позже в С++. Оба способа предлагают набор средств для выделения и освобождения памяти и имеют свои недостатки и преимущества. Рассмотрим сначала функциональный способ.
Функции библиотеки alloc. Для выделения динамической памяти в библиотеке функции alloc существуют две функции, например:
void *malloc(unsigned s);
void *calloc(unsigned n, unsigned m);
malloc возвращает указатель на блок динамической памяти длиной в s байт. При неудачном выделении возвращает NULL. Функция calloc возвращает указатель на блок динамической памяти для размещения n элементов по m байт каждый. При неудачном выделении возвращает NULL.
Примеры использования функций:
int *a=(int*)malloc(sizeof(int)); // динамический объект типа int
char *str=(char*)malloc(255*sizeof(char)); // массив из 255 char
При динамическом распределении памяти для массивов следует описать соответствующий указатель и присваивать ему значение. Одномерный массив a[10] из элементов типа float можно создать следующим образом с помощью функции calloc, как показано в следующем примере:
float *a;
a=(float*)(calloc(10,sizeof(float));
Для освобождения блока динамической памяти используется функция free, как показано в следующем примере:
free(str);
Для многомерных массивов память нужно освобождать в обратном порядке, например:
for(int i=0;i<10;i++)
free(a[i]);
free(a);
Операторы new и delete. В С++ появилась пара операторов, предназначенных для работы с динамической памятью – это new и delete. Их использование помогает упростить текст программы, делает его более прозрачным, например:
int *a=new int; // объект типа int.
float *b=new float[N]; // массив из N объектов типа float.
...
delete a; // освободили память
delete []b;
Следует заметить, что функция alloc возвращают безликий указатель на void, который требуется в явном виде преобразовать в тип указателя слева от =.
При использовании оператора new это не требуется. Также не требуется вызывать sizeof для определения размера объекта.