智能指针weak_ptr使用

weak_ptr 的作用就是为了解决 shared_ptr 循环引用的问题,原理是对于shared_ptr 的指针采用只引用不计数的方法。

weak_ptr 的初始化只能是 weak_ptr 和 shared_ptr 的类型数据。

weak_ptr 使用之前需要做安全检测,expired() 判断是否有效,返回类型为bool值

lock返回值是一个 shared_ptr,如果内存已经被释放了,则会返回一个null。

 

复制代码
#include<iostream>
#include<memory>
using namespace std;

class A {
private:
    int a;
    int b;
public:
    A(){};
    A(int a, int b):a(a), b(b){};
    int get_a() {
        return a;
    };
    int get_b() {
        return b;
    }
    void set_a(int val) {
        a = val;
    }
    void set_b(int val) {
        b = val;
    }
};

int main() {
    shared_ptr<A> pa(new A());
    shared_ptr<A> pb = make_shared<class A>(1,2);
    pa->set_a(3);
    cout << pa->get_a() << endl;    //3
    cout << pa->get_b() << endl;    //0

    cout << pb->get_a() << endl;    //1
    cout << pb->get_b() << endl;    //2

    cout << pa.use_count() << endl; //1

    weak_ptr<A> wa = pa;
    cout << wa.use_count() << endl; //1
    cout << pa.use_count() << endl; //1

    cout << wa.lock()->get_a() << endl; //3
    cout << wa.use_count() << endl;     //1
    cout << pa.use_count() << endl;     //1

    auto p = wa.lock();
    cout << p->get_b() << endl;    // 0
    cout << wa.use_count() << endl;    //2
    cout << pa.use_count() << endl;     //2  

    weak_ptr<A> wb(pb);
    pb.reset();
    if (wb.lock() == nullptr) {
        cout << "pb is expired" << endl;
    }
    else {
        cout << wb.lock()->get_a() << endl;
    }

    pa.reset();
    if (wa.expired()) {
        cout << wa.lock()->get_a() << endl;
    }
    else {
        cout << "pa is expired" << endl;
    }

    return 0;
}
复制代码

 

posted @   王清河  阅读(439)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2019-10-14 02-线性结构1 两个有序链表序列的合并 (15 分)
2019-10-14 01-复杂度3 二分查找 (20 分)
2019-10-14 1排版
2019-10-14 网络嗅探器
2019-10-14 ICMP报文
2019-10-14 struct udphdr
2019-10-14 struct tcphdr
点击右上角即可分享
微信分享提示