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

Класс weak_ptr

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

Привязка указателя weak_ptr к shared_ptr не изменяет счётчик ссылок этого указателя, следовательно, как только последний указатель типа shared_ptr будет удален, даже при наличии указателя weak_ptr, объект будет удален.

Создать указатель weak_ptr можно инициализацией его указателем типа shared_ptr. Поскольку объект может больше не существовать, то использовать указатели week_ptr для непосредственного доступа к объекту надо внимательно. Для этого следует вызвать функцию lock(),которая проверяет существование объекта, на который указывает week_ptr. Если объект существует, то метод lock() вернет указатель shared_ptr на совместно используемый объект, гарантирующий существование объекта, на который он указывает, пока существует указатель shared_ptr.

Использование динамических массивов

Операторы new и delete в C++ предназначены для резервирования и освобождения памяти под объекты по принципу, описанному в стандарте C++, который выделяет и освобождает память по одному элементу.

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

Память, резервируемая оператором new называется динамическим массивом, но при этом тип массива не создаётся. Для динамического массива, созданного с помощью оператора new, не могут быть вызваны функции такого рода, как begin, end. Зарезервированные оператором new объекты всегда инициализируются значением по умолчанию.

При списочной инициализации переданные инициализаторы используются для инициализации первых элементов массива. Если инициализаторов меньше, чем элементов массива, то остальные элементы инициализируются значением по умолчанию. Если инициализаторов больше, чем элементов, то оператор new потерпит неудачу и будет передавать исключение типа bad_array_new_length.

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

Элементы созданного массива всегда удаляются в обратном порядке.

Смарт поинтеры и динамические массивы

Чтобы использовать указатель типа uniqptr для управления динамическим массивом, после типа объекта следует расположить пару квадратных скобок. Операторы доступа к элементам (. И ->) не поддерживаются указателем uniqptr на массивы.

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

По умолчанию указатель sharedptr использует оператор delete для удаления объекта, на который он указывает. Если удаляемый объект представляет собой динамический массив, то при вызове оператора delete обязательно указывать [ ].