成都网站建设设计

将想法与焦点和您一起共享

c++智能指针weak_ptr的使用

本篇内容介绍了“c++智能指针weak_ptr的使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

米易网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。创新互联2013年开创至今到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联

智能指针 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 w空weak_ptr,可以指向类型为T*的对象。
weak_ptr w(sp)与shared_sp sp指向相同对象的weak_ptr。T必须能转换为sp所指的类型。
w = pp可以是一个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。
小例子索引
代码块功能描述
test1weak_ptr不增加引用计数
test2weak_ptr没有->和*操作
test3lock使用
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++智能指针weak_ptr的使用
文章源于:http://chengdu.cdxwcx.cn/article/igpcdd.html