1、关于智能指针的理解
1)智能指针是使用RAII技术(资源的获取即初始化)对普通指针进行封装得到的,其实质是一个指针,使用起来像指针。
2)智能指针可以用来解决程序员忘记使用delete释放内存从而导致内存泄漏,或者多次释放同一块内存,以及当程序出现异常时进入catch块中导致内存忘记释放。
3)智能指针还可以将值语义转换成引用语义。
2、智能指针的使用(智能指针有三个:shared_ptr、unique_ptr、weak_ptr,放在头文件的memory里)
1)由于智能指针是C++11标准下的boost库中的,而boost库是对STL的扩展,所以智能指针也是属于模板类,需要指定类型,传入的指针可以使用构造函数或者使用make_shared函数进行初始化。
2)shared_ptr内部有一个计数器,每次使用,引用计数加一,析构的时候引用计数减一,当引用计数为0时,释放分配的堆内存,因此shared_ptr为多个指针指向相同的对象。
3)拷贝操作会使引用计数加一,赋值操作会使引用减一,同理当引用计数为0时,自动释放内存,若内存释放完后,又让智能指针指向新的对象,那么引用计数加一,指向新对象。
4)get函数可以用来获取原始指针。
5)若一个指针同时用多个shared_ptr进行封装,会出现多次释放同一个内存的操作。
6)避免循环引用,循环引用会导致堆内存无法释放。
7)unique_ptr智能指针同一个时刻只能有一个指针指向对象,也就是说只能有一个指针拥有对象,在出现异常的情况下,动态资源能得到释放。其具有生命周期,从创建开始到离开作用域结束,此时释放指向的对象,并且在作用域内可以修改其指向的对象,不允许拷贝与赋值,因为是指针同一时刻独占这个对象,可以通过移动语义move来实现,或者reset重新进行指定,也可以使用Release来释放其所有权。
8)weak_ptr智能指针是用来与shared_ptr指针配合使用的,不具有普通指针的行为,没有重载操作符*和操作符->,用来观测shared_ptr资源,可以通过一个shared_ptr对象或者另一个weak_ptr对象构造,从而获得资源观测的权限。可以通过use_count函数来返回观测的资源的引用计数,还可以通过expired()函数来判断观测的资源是否存在,比前者要来的快,还可以通过使用其成员函数lock()来获得被观测的对象,从而操作资源。当观测的资源不存在时,返回一个存放空指针shared_ptr.