std::weak_ptr<T>::~weak_ptr
Материал из cppreference.com
<tbody>
</tbody>
~weak_ptr(); |
(начиная с C++11) | |
Уничтожает объект weak_ptr. Не влияет на управляемый объект.
Пример
Программа показывает эффект "неразрывного" цикла объектов std::shared_ptr.
Запустить этот код
#include <iostream>
#include <memory>
#include <variant>
class Node {
char id;
std::variant<std::weak_ptr<Node>, std::shared_ptr<Node>> ptr;
public:
Node(char id) : id{id} {}
~Node() { std::cout << " '" << id << "' очищен\n"; }
/*...*/
void assign(std::weak_ptr<Node> p) { ptr = p; }
void assign(std::shared_ptr<Node> p) { ptr = p; }
};
enum class shared { all, some };
void test_cyclic_graph(const shared x) {
auto A = std::make_shared<Node>('A');
auto B = std::make_shared<Node>('B');
auto C = std::make_shared<Node>('C');
A->assign(B);
B->assign(C);
if (shared::all == x) {
C->assign(A);
std::cout << "Все ссылки являются общими указателями";
} else {
C->assign(std::weak_ptr<Node>(A));
std::cout << "Одна ссылка это weak_ptr";
}
/*...*/
std::cout << "\nВыход...\n";
}
int main() {
test_cyclic_graph(shared::some);
test_cyclic_graph(shared::all); // производит утечку памяти
}
Вывод:
Одна ссылка это weak_ptr
Выход...
'A' очищен
'B' очищен
'C' очищен
Все ссылки являются общими указателями
Выход...
Смотрите также
разрушает объект, которым владеет, если больше нет shared_ptr ссылающихся на него (public функция-элемент std::shared_ptr)
|