Пространства имён
Варианты
Действия

std::weak_ptr<T>::~weak_ptr

Материал из cppreference.com
< cpp‎ | memory‎ | weak ptr
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Динамическое управление памятью
no section name
Ограниченные алгоритмы неинициализированной памяти
no section name
Поддержка сбора мусора
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)



no section name
 
std::weak_ptr
Функции-элементы
weak_ptr::~weak_ptr
Модификаторы
Наблюдатели
Функции, не являющиеся элементами
Вспомогательные классы
Правила вывода(C++17)
 
~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) [править]