c++智能指针weak_ptr的使用
发表于:2025-02-09 作者:千家信息网编辑
千家信息网最后更新 2025年02月09日,本篇内容介绍了"c++智能指针weak_ptr的使用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!智
千家信息网最后更新 2025年02月09日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安全错误
数据库的锁怎样保障安全
国际服什么时候能更新到服务器
网络安全法34条
分析网络安全框架
音乐播放器的软件开发
网络安全法手绘
网络安全 班会主持稿
网络安全学成了nb不
怀来天气预报软件开发
android远程数据库
怎流连接到服务器
查看数据库大小
关于网络安全的时事新闻
淄博应用软件开发服务
旅游大数据软件开发公司
数据库中怎么合并表
网络安全人才分布不均
mac上传文件到服务器
数据库中没有gbk
四川 计算机网络安全与管理
服务器mem灯亮
关系数据库查询的语句是
jsp数据库数据在前端显示
深圳软件开发人才去哪里招
数据库租赁系统源码
网络电视数据库
网站如何动态链接数据库
atm是一种网络技术
第一个首都网络安全日
学习计算机网络技术需要英语吗
旅游大数据软件开发公司