c++智能指针weak_ptr的使用
发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,本篇内容介绍了"c++智能指针weak_ptr的使用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!智
千家信息网最后更新 2025年12月01日c++智能指针weak_ptr的使用
本篇内容介绍了"c++智能指针weak_ptr的使用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
智能指针 weak_ptr 使用
weak_ptr用途:
1,解决空悬指针问题
2,解决循环引用问题
weak_ptr特点:没有*操作和->操作
weak_ptr是不控制所指对象生存周期的智能指针,它指向由一个shared_ptr管理的对象。将一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的计数器。一旦最后一个指向对象的shared_ptr被销毁,对象就会被释放,即使有weak_ptr指向这个对象,对象也会被释放。
一,先来个表格,唠唠weak_ptr
| 操作 | 功能描述 |
|---|---|
| weak_ptr | 空weak_ptr,可以指向类型为T*的对象。 |
| weak_ptr | 与shared_sp sp指向相同对象的weak_ptr。T必须能转换为sp所指的类型。 |
| w = p | p可以是一个shared_ptr或一个weak_ptr。赋值后w指向p所指的对象。 |
| w.reset() | 将w置为空 |
| w.use_count() | 与w共享对象的shared_ptr的数量 |
| w.expired() | 若w.use_count()为0,返回true,否则返回false |
| w.lock() | 如果expired()为true,返回一个空shared_ptr;否则返回一个指向w所指对象的shared_ptr。 |
小例子索引
| 代码块 | 功能描述 |
|---|---|
| test1 | weak_ptr不增加引用计数 |
| test2 | weak_ptr没有->和*操作 |
| test3 | lock使用 |
| test4 | 循环引用,导致即使是智能指针也不能释放内存。用weak_ptr解决了循环引用,导致的内存不能释放的问题 |
小例子
#include#include #include using namespace std; class Test{ public: Test(int d = 0) : data(d){cout << "new" << data << endl;} ~Test(){cout << "del" << data << endl;} void func(){cout << "func" << endl;} private: int data; }; //test4 循环引用,导致即使是智能指针也不能释放内存 class teacher; class student; class teacher{ public: teacher(){cout << "teacher()" << endl;} ~teacher(){cout << "del teacher" << endl;} shared_ptr stu; }; class student{ public: student(){cout << "student()" << endl;} ~student(){cout << "del student" << endl;} //如果换成shared_ptr tea;就会形成循环引用,导致内存泄漏 weak_ptr tea; }; int main(){ //test1 weak_ptr不增加引用计数 /* shared_ptr sp1 = make_shared (1); cout << sp1.use_count() << endl;//1 weak_ptr wp1 = sp1; cout << wp1.use_count() << endl;//1 */ //test2 weak_ptr没有->和*操作 //wp1->func(); //(*wp1).func(); //test3 lock使用 /* shared_ptr sptr; sptr.reset(new int); *sptr = 10; weak_ptr weak1 = sptr; sptr.reset(new int); *sptr = 5; weak_ptr weak2 = sptr; // weak1 is expired! if(auto tmp = weak1.lock()) cout << *tmp << '\n'; else cout << "weak1 is expired\n"; // weak2 points to new data (5) if(auto tmp = weak2.lock()) cout << *tmp << '\n'; else cout << "weak2 is expired\n"; */ //test4 循环引用,导致即使是智能指针也不能释放内存 //用weak_ptr解决了循环引用,导致的内存不能释放的问题 shared_ptr tptr(new teacher);//计数器1 shared_ptr sptr(new student);//计数器1 tptr->stu = sptr;//sptr的计数器2 sptr->tea = tptr;//不增加tptr的引用计数,因为tea是weak指针 cout << tptr.use_count() << endl;//1 cout << sptr.use_count() << endl;//2 return 0; }
"c++智能指针weak_ptr的使用"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
对象
指针
智能
指向
循环
内存
所指
计数器
问题
c++
例子
内容
功能
更多
知识
类型
实用
相同
学有所成
接下来
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全web的题
华为手机网络安全设置
分期购物软件开发
厦门软件开发多少钱
计算机网络技术电子信息
多客网络技术
Web服务器系统安全防护
网络安全条例第30条
网络安全英语知识
数据库mdf文件查看
物联网网络安全蚂蚁文库
端游pubg怎么换服务器
服务器网卡批量测试
智能网联汽车 服务器在境外
免流软件开发
如何建数据库索引
计算机网络安全学校网络论文
农安智能网络技术诚信服务
方舟服务器怎么改成英文
vrar软件开发
软件开发项目中的分工
国内全文数据库的共同特点
vbsexcel数据库访问
软件开发在哪个专业
服务器可以更改地址吗
中通吉网络技术有限公司工作
在联通做软件开发怎么样
电力公司违反网络安全事例
网络安全管理局改革
软件开发公司的存货