最近在看一本书《boost程序库完全开发指南》,boost是一个强大的C++程序库,丰富了C++的功能和表现力,使得C++软件开发更加简洁、优雅、灵活和高效。因为之前使用Qt做了很多项目,我发现boost和Qt有很多相似之处,比如时间、智能指针、字符串处理、函数信号槽等,在Qt中最好还是用Qt中封装好的东西来做。下面归纳最近所学习的boost只能指针知识。
一、为何要使用智能指针
C++程序员通常使用RAII机制(资源获取即初始化)来管理内存资源,在构造函数中申请资源,析构函数中释放资源。局部对象是用声明的方式在栈上创建的,RAII机制工作正常。但如果对象是通过new的方式在堆上创建的,那么使用完之后必须手动delete才能释放资源。智能指针为了解决这个问题而出现,退出作用域时,智能指针总能调用delete析构在堆上动态分配的对象。
使用智能指针需要包含头文件
#include <boost/smart_ptr.hpp>
using namespace boost;
二、scoped_ptr
特点:只能在本作用域内使用,不能转让。(在内部实现中,拷贝构造函数和赋值操作符都被声明为私有的)
reset()函数重置scoped_ptr,删除原来的指针,再保存新的指针值(一般不调用)
scoped_ptr不支持比较操作,但可以测试它是否为空。
swap()交换两个scoped_ptr保存的原始指针。
get()可以获得scoped_ptr保存的原始指针。
三、shared_ptr
引用计数型智能指针,可以被自由地拷贝和赋值,当没有代码使用(引用计数为0时)才删除被包装的封装的对象。
reset()将引用计数减一,引用计数为0时才发生删除操作。
使用unique()和use_count()来检查引用计数。
支持比较操作。
线程安全。
转型函数有const_pointer_cast<T>()、static_pointer_cast<T>()、dynamic_pointer_cast<T>()