智能指针就是类,当超出了类的作用域,类会自动调用析构函数,析构函数释放资源,就不需要再手动释放资源了。
所有权模式;
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);
替换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基本操作
解决auto_ptr只能独占对象的问题,可以共享所有权的智能指针。
多个智能指针可以指向相同对象,该对象和其相关资源会在“最后一个引用被销毁”时候释放。
成员函数:
use_count 返回引用计数的个数
unique 返回是否是独占所有权( use_count 为 1)
swap 交换两个 shared_ptr 对象(即交换所拥有的对象)
reset 放弃内部对象的所有权或拥有对象的变更, 会引起原有对象的引用计数的减少
get 返回内部对象(指针), 由于已经重载了()方法, 因此和直接使用对象是一样的.如 shared_ptr<int> sp(new int(1)); sp 与 sp.get()是等价的
为了配合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