- •Лекция 1 Динамическая память и интеллектуальные указатели.
- •Лекция 2
- •Лекция 3
- •Исчерпание памяти
- •Лекция 4 Smart-pointer для обработки исключений
- •Создание собственного кода удаления
- •Класс unique_ptr
- •Класс weak_ptr
- •Использование динамических массивов
- •Смарт поинтеры и динамические массивы
- •Класс allocator
- •Тема 2. Обработка исключительных ситуаций
- •Лекция 7
- •Класс Exception
- •Лекция 8
- •Потоки, буферы и файл iostream
- •Перегруженная операция вставки
- •Лекция 9
- •Ввод с помощью cin
- •Тема 4. Файловый ввод/вывод
- •Лекция 10
- •Режимы открытия файла
- •Бинарные файлы
- •Лекция 11
- •Тема 5. Библиотека шаблонов Standart Template Library (stl)
- •Шаблонный класс Vector
- •Лекция 12
- •Цикл for , основанный на диапазоне
- •Обобщённое программирование
- •Лекция 13
- •Виды итераторов
- •Входные итераторы
- •Однонаправленные итераторы
- •Двунаправленные итераторы
- •Произвольного доступа
- •Лекция 14 Двунаправленные итераторы
- •Виды контейнеров
- •Лекция 15 Разработка с использованием Java-платформы
- •Этапы развития языка Java
- •Байт-код
- •Особенности языка Java
- •Программная платформа и виртуальная машина Java
- •Особенности разработки и исполнения объектно-ориентированных приложений на Java Сборка мусора в Java
- •Пакет jdk
- •Ide для работы на Java
- •Особенности настройки работы платформы Java
- •Запуск приложения на языке Java без ide
- •Особенности лексики Java
- •Примитивные типы данных Java
- •Переменные
- •Объявление переменной
- •Область и срок действия переменной
- •Преобразование и приведение типов. Автоматическое приведение и продвижение типов в выражениях. Логические выражения. Арифметические операции
- •Логические операции
- •Предшествование операций
- •Управляющие операторы
- •Операторы выбора Условный оператор if
- •Операторы цикла
- •Разновидность цикла for в стиле for each
- •Применение оператора instanceof
- •Принципы ооп
Лекция 2
Значение счетчика уменьшается при:
присваивании нового значения указателю shared_ptr
когда он удаляется
когда локальный указатель выходит из области видимости
Как только счетчик достигает нуля, он автоматически освобождает указатель на объект, на который он указывает.
Будет ли использоваться счетчик или любая другая структура данных для отслеживания количества указателей, зависит от реализации компилятора.
Когда последний указатель shared_ptr удаляется, его класс автоматически удаляет объект, на который он указывает, и освобождает память. Это делает деструктор объекта (определяет или контролирует действия, происходящие при удалении). Деструктор указателя shared_ptr осуществляет декремент счетчика ссылок, на который он указывает.
Память не будет освобождена, если на нее будет указывать любой указатель типа shared_ptr. Поскольку память не освобождается, пока не удаляется последний указатель shared_ptr, то важно гарантировать, что ни одного указателя типа shared_ptr не останется после того, как необходимость использования указателя пропадет. Если не удалить – утечка памяти.
Если указатель типа shared_ptr помещается в контейнер, но будут использованы только некоторые, то остальные стоит удалить самостоятельно.
Обычно динамическое выделение памяти используют в след. случае:
неизвестно количество элементов
неизвестен точный тип
нельзя разрешать совместное использование несколькими объектами (т.е. потоками)
Классы контейнеров при выделении динамической памяти используются, когда неизвестно количество элементов и их тип.
При копировании вектора элементы исходного вектора копируются в независимые элементы другого вектора. Элементы вектора существуют только пока существует сам объект. Удаляется вектор – удаляются элементы. Но существуют классы, которые резервируют ресурсы, продолжительность существования которых зависит от первоначального объекта.
Основная причина использования в том, чтобы позволить нескольким объектам корректно совместно использовать одни данные.
Простейший способ реализации нового типа коллекции подразумевает использование одного из библиотечных контейнеров stl. Это позволяет делегировать управлением элементом библиотечному типу.
Копирование указателя shared_ptr приводит к инкременту его счетчика ссылок, присваивание одного указателя shared_ptr другому приводит к декременту счетчика ссылок левого операнда и инкременту счетчика ссылок правого операнда.
Созданием динамической памяти объектов не приводит к созданию имен. Оператор new возвращает указатель на зарезервированный объект.
Инициализация присваивает объекту определенное значение в момент его создания. Используемые для инициализации переменных значения могут быть сложными выражениями. Когда в одном операторе определяется несколько переменных их имена следуют друг за другом и возможно инициализировать переменную значением другой переменной, определенной в этом выражении.
В С++ инициализация переменной происходит только один раз при ее создании, присваивание удаляет текущее значение объекта и заменяет его новым. Списки инициализаторов в фигурных скобках можно теперь использовать всегда, когда инициализируется объект. При использовании списочной инициализации используется каждое преимущество: компилятор не позволит инициализировать переменные встроенного типа если инициализация может привести к потере информации.
24 фев 2021