C++ 智能指针相关

5.智能指针

C++程序设计中的内存管理通常会有程序员申请+及时释放,但是在实际情况中会有很多指针频繁的申请和释放,容易出现一些疏忽大意的问题(内存泄漏)。C++11中引入智能指针的概念,智能指针能够更好的管理内存。
4.1 智能指针:
1.实质:对普通指针的进一步封装,实质是一个类对象,行为表现和指针一样。
2.作用:防止程序员忘记调用delete释放内存,以及其他程序内存异常情况造成的程序崩溃。
3.功能: 当智能指针(类对象)被使用过之后,会被自动删除,指向的内存也会自动的释放。

4.2 四种智能指针分类:
智能指针在C++11版本之后提供,包含在头文件中,
auto_ptr(C++11 已经废弃)、unique_ptr、shared_ptr、weak_ptr
1.auto_ptr
auto_ptr 由 C++98 引入,其功能和用法类似于 unique_ptr,由 new expression 获得对象,在 auto_ptr 对象销毁时,他所管理的对象也会自动被 delete 掉。C++11中用unique_ptr来替换auto_ptr,原因是前者的安全性更高。
详情移步四种智能指针详解
2.unique_ptr
unique_ptr (独一无二的ptr) 该指针不共享它所指向的对象,也即是它无法复制到另外一个unique_ptr指针,内有拷贝语义,只能是将其管理的内存资源权限进行转移unique_ptr<string> u_ptr1 = std::move(u_ptr2);,转移之后,原指针将不再拥有此资源。而auto_ptr有拷贝语义,没有转移语义,也就是会增加内存出现问题的概率。如下

unique_ptr<string> upt(new string("lvlv"));
unique_ptr<string> upt1(upt);	//编译出错,已禁止拷贝
unique_ptr<string> upt1=upt;	//编译出错,已禁止拷贝
unique_ptr<string> upt1=std::move(upt);  //控制权限转移
auto_ptr<string> apt(new string("lvlv"));
auto_ptr<string> apt1(apt);	//编译通过
auto_ptr<string> apt1=apt;	//编译通过

3.shared_ptr
shared_ptr 与 unique_ptr形成对比,shared_ptr是允许多个指针指向同一个对象,它是为了解决(auto_ptr)unique_ptr在对象所有权的局限性,后者在对象的内存管理权上是独占的。shared_ptr使用引用计数,每一个shared_ptr的拷贝都指向相同的内存。每使用他一次,内部的引用计数加1,每析构一次,内部的引用计数减1,减为0时,自动删除所指向的堆内存。shared_ptr内部的引用计数是线程安全的,但是对象的读取需要加锁。
4.weak_ptr
weak_ptr 被设计为与shared_ptr共同工作,weak_ptr 是为了配合 shared_ptr 而引入的一种智能指针,它更像是 shared_ptr 的一个助手而不是智能指针,因为它不具有普通指针的行为,没有重载 operator* 和 operator-> ,因此取名为 weak,表明其是功能较弱的智能指针。它的最大作用在于协助 shared_ptr 工作,可获得资源的观测权,像旁观者那样观测资源的使用情况。观察者意味着 weak_ptr 只对 shared_ptr 进行引用,而不改变其引用计数,当被观察的 shared_ptr 失效后,相应的 weak_ptr 也相应失效。

weak_ptr<T> w;	 	//创建空 weak_ptr,可以指向类型为 T 的对象
weak_ptr<T> w(sp);	//与 shared_ptr 指向相同的对象,shared_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,否则返回非空 shared_ptr

猜你喜欢

转载自blog.csdn.net/GJQJFJ/article/details/106228004
今日推荐