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

ООП

10 фев 2021

Лекция 1 Динамическая память и интеллектуальные указатели.

Глобальные объекты создаются при запуске программы и освобождается при ее завершении. Локальные автоматические объекты создаются при входе в блок, где они определены, и удаляются при выходе из блока. Статические локальные объекты создаются перед первым их использованием и удаляются при завершении приложения. Продолжительность существования динамических объектов не зависит от того, где они созданы. Они существуют пока не будут освобождены явно. Для создания безопасного динамического использования объектов библиотека С++ предоставляет SmartPointer. Они гарантируют, что объекты, на которые они указывают, будут автоматически освобождены в нужный момент. Статическая память используется для локальных и глобальных статических переменных, и статических полей класса. Стек используется для нестатических объектов определенных функций. Объекты, расположенные в статической памяти или стеке, автоматически создаются и удаляются компилятором. Приложения, используемые для динамического выделения памяти, резервирует и освобождает память во время выполнения, при этом необходимо приложению контролировать продолжительность существования объекта. Т.е. явно освобождать динамически выделенную память не нужно. При неосвобождении памяти может появиться утечка памяти. Если освободить память слишком рано, пока еще существуют указатели на нее, то указатели на несуществующую область памяти.

Wildpointer, danling pointer. Для реализации безопасной работы с динамической памяти С++ предоставляет смарт поинтер. Действует точно так же, как обычный указатель, но автоматически удаляет объект, на который он указывает, когда необходимость в этом объекте отсутствует. Библиотека С++ определяет следующие виды умных указателей:

  • Shared_ptr – позволяет нескольким указателям указывать на один объект. Обертывает указатель с подсчетом ссылок на динамически созданный объект.

  • Unique_ptr - один объект -> один указатель.

  • Weak_ptr – является второстепенной ссылкой на объект, управляемый указателем Shared_ptr.

Все три класса определены в заголовке memory.

Класс shared_ptr. Классы интеллектуальных указателей являются шаблонными, поэтому при создании интеллектуального указателя тип данных, на который способен указывать указатель, необходимо задать в < тип_данных >, следующих за типом указателя.

Инициализированный по умолчанию смарт поинтер хранит нулевой указатель.

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

Наиболее безопасный способ резервирования и использования динамической памяти со смарт указателями является использование функции std::make_shared<object>(). Функция создает и возвращает указатель типа shared_ptr, который указывает на созданный объект, построенный из нуля или более аргументов с использованием распределителя по умолчанию. При вызове функции make_shared() следует указать тип создаваемого объекта, это подобно использованию шаблона класса, за именем функции следует указание типа в угловых скобках. Функция make_shared() использует свои аргументы для создания объекта заданного типа. Если не передать аргументы в функцию make_shared(), то объект будет проинициализирован объекту по умолчанию. Для облегчения определения типа объекта, содержащего результат вызова функции make_shared(), можно использовать ключевое слово auto. При копировании и присваивании указателя типа shared_ptr каждый из них отслеживате количество других указателей типа shared_ptr. Для реализации этой задачи в классе shared_ptr используется счетчик, называемый обычно счетчиком ссылок (or reference count). При копировании указателя shared_ptr значение счетчика увеличивается. Значение связанного с указателем shared_ptr счетчика увеличивается, когда он используется:

  1. Для инициализации другого указателя shared_ptr

  2. При использовании его в качестве правого оператора присвивания

  3. При передаче его в функцию

  4. При возврате

17 фев 2021