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

24. Особенности совместного использования обычных указателей и интеллектуальных. Примеры использования.

При связывании shared_ptr c простым указателем, ответственность за эту память передается shared_prt и данную дин память мб исп-ся только через shared_ptr. !!Не смешивать smart_ptr и обычные указатели.

class Item

{

public:

Item() { std::cout << "Item acquired\n"; }

~Item() { std::cout << "Item destroyed\n"; }

};

int main()

{

// Выделяем Item и передаём его в std::shared_ptr

Item *item = new Item;

std::shared_ptr<Item> ptr1(item);

{

std::shared_ptr<Item> ptr2(ptr1); // используем оператор присваивания копированием для создания второго std::shared_ptr из ptr1, указывающего на тот же Item

std::cout << "Killing one shared pointer\n";

} // ptr2 выходит из области видимости здесь, но больше ничего не происходит

std::cout << "Killing another shared pointer\n";

return 0;

} // ptr1 выходит из области видимости здесь и выделенный Item уничтожается также здесь

25. Основные операции для работы указателем shared_ptr. Способы его определения и изменения. Использование метода reset(). Примеры использования.

reset() – аннулирует счётчик ссылок и ,при необходимости, удаляет объект на который ссылается shared_ptr.

26. Особенности использования интеллектуальных указателей и исключений. Примеры использования.

27. Особенности использования интеллектуальных указателей и классов без деструкторов. Примеры использования.

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

28. Использование собственного кода удаления. Примеры использования.

29. Класс интеллектуального указателя unique_ptr. Методы класса указателя unique_ptr. Особенности использования. Примеры использования.

std::unique_ptr является заменой std::auto_ptr в C++11. Вы должны использовать именно его для управления любым динамически выделенным объектом/ресурсом, но с условием, что std::unique_ptr полностью владеет переданным ему объектом, а не делится «владением» ещё с другими классами. std::unique_ptr находится в заголовочном файле memory.

Рассмотрим простой пример использования std::unique_ptr:

#include <iostream>

#include <memory> // для std::unique_ptr

class Item

{

public:

Item() { std::cout << "Item acquired\n"; }

~Item() { std::cout << "Item destroyed\n"; }

};

int main()

{

// Выделяем объект класса Item и передаём право собственности на него для std::unique_ptr

std::unique_ptr<Item> item(new Item);

return 0;

}

Методы:

release() – прекращает контроль содержимого указателя unique_ptr , возвращает содержимое указателя unique_ptr и обнуляет его.

reset() – удаляет объект на который указывает указатель unique_ptr. Если при его вызове предоставляется другой указатель unique_ptr будет указывать на него в противном случае unique_ptr будет обнуляться. Т.к. unique_ptr единолично владеет объектом, на кот указывает, то он не поддерживает обычного копир и присваивания.