首页 > 其他 > 详细

智能指针

时间:2019-07-18 21:03:07      阅读:67      评论:0      收藏:0      [点我收藏+]

智能指针就是类,当超出了类的作用域,类会自动调用析构函数,析构函数释放资源,就不需要再手动释放资源了。

1、auto_ptr(cpp11抛弃)

所有权模式;

1 auto_ptr< string> p1 (new string ("I reigned lonely as a cloud.”));
2 auto_ptr<string> p2;
3 p2 = p1; //auto_ptr不会报错.

当p1指针赋值给了p2,相当于这块内存的所有权给了p2,在访问p1就会报错。

缺点:内存崩溃问题。

auto_ptr操作

1 auto_ptr<int> p1;//创建一个空指针
2 
3 auto_ptr<int> p1;
4 double* p2 = new double;
5 p1 = auto_ptr<int>(p2);//将p2赋给p1,不能将智能指针赋给非智能指针,智能指针之间可以相互赋值
6 
7 double* p2 = new double;
8 autp_ptr<int> p1(p2);

2、unique_ptr

替换auto_ptr;

独占式拥有,同一时间只能有一个智能指针可以指向对象。

解决了忘了delete造成的内存泄漏问题。

不可以将一个unique_ptr指针赋值给另一个unique_ptr指针,除非源unique_ptr是个临时右值。

unique_ptr<string> pu1(new string ("hello world"));
unique_ptr<string> pu2;
pu2 = pu1;                                      // #1 not allowed
unique_ptr<string> pu3;
pu3 = unique_ptr<string>(new string ("You"));   // #2 allowed

或者使用std::move,将一个unique_ptr赋给另外一个:

unique_ptr<string> ps1, ps2;
ps1 = demo("hello");
ps2 = move(ps1);
ps1 = demo("alexia");
cout << *ps2 << *ps1 << endl;

unique_ptr基本操作

 

3、shared_ptr

解决auto_ptr只能独占对象的问题,可以共享所有权的智能指针。

多个智能指针可以指向相同对象,该对象和其相关资源会在“最后一个引用被销毁”时候释放。

成员函数:

use_count 返回引用计数的个数

unique 返回是否是独占所有权( use_count 为 1)

swap 交换两个 shared_ptr 对象(即交换所拥有的对象)

reset 放弃内部对象的所有权或拥有对象的变更, 会引起原有对象的引用计数的减少

get 返回内部对象(指针), 由于已经重载了()方法, 因此和直接使用对象是一样的.如 shared_ptr<int> sp(new int(1)); sp 与 sp.get()是等价的

4、weak_ptr

为了配合shared_ptr指针的工作引入的。

如果两个shared_ptr指针相互引用时,那么这两个指针的引用计数永远不可能下降到0,产生死锁问题。

weak_ptr是一种弱引用,不会增加对象的引用计数,和shared_ptr之间可以相互转化,shared_ptr可以直接赋值给它,它可以通过调用lock函数来获得shared_ptr。

不能通过weak_ptr直接访问对象的方法,应该先把它转化为shared_ptr。

 

智能指针

原文:https://www.cnblogs.com/pacino12134/p/11209858.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!