std::weak_ptr<T>::~weak_ptr

来自cppreference.com
< cpp‎ | memory‎ | weak ptr
 
 
工具库
语言支持
类型支持(基本类型、RTTI)
库功能特性测试宏 (C++20)
动态内存管理
程序工具
协程支持 (C++20)
变参数函数
调试支持
(C++26)
三路比较
(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)

 
动态内存管理
未初始化内存算法
受约束的未初始化内存算法
分配器
垃圾收集器支持
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)



 
 
~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 指向所持有的对象,则析构该对象
(std::shared_ptr<T> 的公开成员函数)