Скачиваний:
62
Добавлен:
05.07.2021
Размер:
94.13 Кб
Скачать

Лекция 2

Значение счетчика уменьшается при:

  • присваивании нового значения указателю shared_ptr

  • когда он удаляется

  • когда локальный указатель выходит из области видимости

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

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

Когда последний указатель shared_ptr удаляется, его класс автоматически удаляет объект, на который он указывает, и освобождает память. Это делает деструктор объекта (определяет или контролирует действия, происходящие при удалении). Деструктор указателя shared_ptr осуществляет декремент счетчика ссылок, на который он указывает.

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

Если указатель типа shared_ptr помещается в контейнер, но будут использованы только некоторые, то остальные стоит удалить самостоятельно.

Обычно динамическое выделение памяти используют в след. случае:

  • неизвестно количество элементов

  • неизвестен точный тип

  • нельзя разрешать совместное использование несколькими объектами (т.е. потоками)

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

При копировании вектора элементы исходного вектора копируются в независимые элементы другого вектора. Элементы вектора существуют только пока существует сам объект. Удаляется вектор – удаляются элементы. Но существуют классы, которые резервируют ресурсы, продолжительность существования которых зависит от первоначального объекта.

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

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

Копирование указателя shared_ptr приводит к инкременту его счетчика ссылок, присваивание одного указателя shared_ptr другому приводит к декременту счетчика ссылок левого операнда и инкременту счетчика ссылок правого операнда.

Созданием динамической памяти объектов не приводит к созданию имен. Оператор new возвращает указатель на зарезервированный объект.

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

В С++ инициализация переменной происходит только один раз при ее создании, присваивание удаляет текущее значение объекта и заменяет его новым. Списки инициализаторов в фигурных скобках можно теперь использовать всегда, когда инициализируется объект. При использовании списочной инициализации используется каждое преимущество: компилятор не позволит инициализировать переменные встроенного типа если инициализация может привести к потере информации.

24 фев 2021