Скачиваний:
189
Добавлен:
05.07.2021
Размер:
16.53 Mб
Скачать

9. Копирование и присваивание указателей shared_ptr. Примеры использования.

При копировании и присваивании SP каждый из них отслеживает количество других указателей SP на один и тот же объект. С SP всегда связан счетчик ссылок (reference count).

При копировании значение счетчика увеличивается. Т. е. значение счётчика SP увеличивается:

  1. когда указатель используется для инициализации другого SP

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

  3. при возврате его из функции и передаче его функцию (по значению)

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

  1. при присваивании нового значения указателю SP (левый операнд операции присваивания)

  2. когда завершается область видимости

  3. при явном вызове деструктора

Как только счетчик достигнет нуля, SP автоматически освободит памяти, выделенную под объект.

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

10. Создание и использование объектов интеллектуальных указателей. Примеры.

см. вопр. 6, 8, 9

class Order { … };

template<class T>

shared_ptr<Order> orderFactory(T arg) { return make_shared<Order>(arg);}

template<calss T>

void useFactoryOrders(T arg) {

shared_ptr<Order> order_ptr = orderFactory(arg);

// using order_ptr

}

11. Функция make_shared(). Использование функции make_shared() для создания и инициализации объектов интеллектуальных указателей. Примеры использования.

Наиболее безопасный способ резервирования и использования динамической памяти требует использования библиотечной функции make_shared.

Функция make_shared создает и возвращает указатель shared_ptr, который указывает на созданный объект, построенный из нуля или более элементов с использованием распределителя по умолчанию.

При вызове функции make_shared следует указывать тип создаваемого объекта в угловых скобках.

//Использование функции make_shared для создания и инициализации объектов интеллектуальных указателей

#include<iostream>

#include <vector>

using namespace std;

void main() {

//указатель intPtr на объект типа int со значением 42 shared_ptr<int>intPtr1 = make_shared<int>(42); //strPtr указывает на строку со значением '9999999999' shared_ptr<string> strPtr = make_shared<string>(10, '9'); //intPtr2 указывает на объект типа int со значением по умолчанию 0

shared_ptr<int>intPtr2 = make_shared<int>();

//vectPtr указывает на динамически созданный пустой вектор vector<string> auto vectPtr = make_shared<vector<string>>();

}

При использовании make_sharedблок счетчика ссылок и данные можно расположить в памяти последовательно, в одном выделенном блоке памяти. Это достигается за счёт того, что создание объекта и выделение памяти под него изолируется от пользователя и происходит внутри функции make_shared.

12. Счетчик ссылок (reference count), счетчик слабых ссылок (weak count), функция-удалитель (deleter), выделитель памяти (allocator). Примеры использования.

Счетчик ссылок (reference count) — техника хранения количества ссылок, указателей или дескрипторов на какой-то ресурс, например на объект или на блок памяти. Обычно используется как средство освобождения объектов, которые больше не нужны и на них больше нет ссылок.

Слабая ссылка (weak reference) — специфический вид ссылок на динамически создаваемые объекты в системах со сборкой мусора или с подсчётом ссылок. Отличается от строгих ссылок тем, что сборщик мусора не учитывает связь ссылки и объекта в куче при выявлении объектов, подлежащих удалению. Таким образом слабая ссылка позволяет работать с объектом как и строгая ссылка, но при необходимости объект будет удален, даже при наличии слабой ссылки на него.

Аллокатор (Allocator) или  распределитель памяти в языке программирования C++ — специализированный класс, реализующий и инкапсулирующий малозначимые (с прикладной точки зрения) детали распределения и освобождения ресурсов компьютерной памяти.

Аллокатор умеет выделять и освобождать память в требуемых количествах определённым образом. std::allocator - пример реализации аллокатора из стандартной библиотеки, просто использует new и delete, которые обычно обращаются к системным вызовам malloc и free. ( более простыми словами )