智能指针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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于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