智能指针
auto_ptr拥有严格对象所有语义的智能指针
在c++98版本产生,在c++11版本已被抛弃。主要是因为auto_ptr有拷贝语义,允许一个智能指针赋值给另一个智能指针,此时会产生内存空间重复释放导致不安全问题的产生,以及拷贝后原对象失效,再次访问原对象导致程序崩溃。
unique_ptr拥有独享对象所有语义的智能指针
独占式的智能指针,内部禁用了拷贝语义,在任何时间资源只能被一个智能指针占有,当一个unique_ptr离开作用域时(销毁了管理对象/通过release或reset将管理对象交给另一个智能指针),智能指针所包含的内容会释放。
当程序试图将unique_ptr赋值给另一个时,如果源智能指针是一个右值,编译器允许这么做。
shared_ptr拥有共享对象所有语义的智能指针
引用计数型指针,通过指针保持对象共享所有权的智能指针,多个shared_ptr可指向同一个对象。多个shared_ptr可以使用同一块堆内存,由于该类型智能指针在实现上采用了引用计数的机制,即使有一个shared_ptr放弃了堆内存的使用权(此时引用计数-1),也不会影响其他指向同一堆内存的shared_ptr,只有当引用计数为0时,此时智能指针指向的堆内存才会被自动释放,也及以下两种情况:
1:最后占有对象的shared_ptr被销毁
2:最后占有对象的shared_ptr被通过=或reset赋值为另一个智能指针
use_count,unique,reset,swap,get
简单实现链接
weak_ptr对于share_ptr管理对象的弱引用
是一种不控制对象生命周期的智能指针,只提供了对shared_ptr对象访问的一种手段。weak_ptr设计的目的是为配合shared_ptr而引入的一种智能指针来协助shared_ptr工作,它只能从一个shared_ptr或一个weak_ptr构造,它的构造和析构不会影响引用计数的改变,它是对管理对象的一种弱引用,不会增加对象的引用计数,和shared_ptr之间可以相互转化,shared_ptr可以直接赋值给他它,它也可以通过lock函数获得shared_ptr。用以解决shared_ptr循环引用的死锁问题,因为如果两个shared_ptr相互引用,引用计数永远不会变为0,资源不能得到释放。
类型转换
static_cast用于良性类型转换,风险较低
原有的内部类型转换
void*和具体类型指针之间的转换
有转换构造函数或类型转换函数的类与其他类之间的转换
const_cast用于const、volatile类型转换
const_cast不是去除变量的常量性质,而是去除指向常对象的指针或引用的常量性,其去除常量性的对象必须是指针或引用。
reinterpret_cast对二进制的重新解释,风险较高
对二进制位的重新解释,不会借助已有的转换规则进行调整,可以实现最灵活的类型转换,但风险较高。
可以认为是static_cast的补充,可以完成static_cast不能完成的一些转换。
主要有三种用途:改变指针或引用的类型,将指针或引用转换成一个有足够长度的整形,将整形转换为一个指针或引用
dynamic_cast动态类型转换,主要用于类的继承层次之间的类型转换
既允许向上转型,也允许向下转型,向上转型是无条件的,不需要检测都可成功,向下转型的前提必须是安全的,需要借助RTTI检测,只有一部分能够成功。
要求基类必须包含虚函数,只能转换指针类型或引用类型。
运行时处理,其他三类是编译时处理。
不能用于基本数据类型之间的转换。
转换成功返回指向对象的指针或引用,失败返回NULL。
基类一定要有虚函数,向上转型和static_cast相同,向下转换进行类型检测,比static_cast安全。