boost内存管理
Boost库提供了6种智能指针,位于boost命名空间。分别为shared_ptr、weak_ptr、scoped_ptr、scoped_array、shared_array、intrusive_ptr。1
2#include <boost/smart_ptr.hpp>
using namespace std;
1.scoped_ptr
1 | template <typename T> |
类解析
通过将拷贝构造函数和拷贝赋值运算符声明为private的,起到了禁止拷贝和赋值的作用,保证被它管理的指针不能被转让所有权。在c++11中可将函数声明为delete达到同样效果。get()函数返回底层原始指针,不能对此指针delete,否则scoped_ptr析构时将再次delete一次,发生错误。用法
定义一个scoped_ptr:scoped_ptr<string> sp(“this is a test”);
行为如同常规的指针,有解引用*和->运算符,但是没有重载++运算符,不能进行++sp这样的操作。但是无需进行手动的delete,因为这个类在离开其作用域之后会自动的进行销毁。scoped_ptr与auto_ptr的区别
根本性区别在于指针的所有权,auto_ptr被定义为可转移的,具有赋值拷贝等操作。然而scoped_ptr没有,后者保证了指针的绝对安全。共同缺陷,都不能作为容器的元素,前者是因为没有转移语义,后者是因为无法拷贝和赋值。scoped_ptr与unique_ptr的区别
unique_ptr相当于结合了scoped_ptr和scoped_array的功能,基本能力相同,但是unique_ptr拥有更多的功能,可以像原始指针一样比较(定义了相关比较的操作),可以定义删除器,可以放入容器,一般可用unique_ptr来代替scoped_ptr。
2.scoped_array
1 | template <tyname T> |
类解析
接受的指针必须是new[]的结果,不能是new的结果;
没有重载*和->操作符;
析构函数调用的是delete[],而不是delete;
提供了[]操作符,可以像数组一样操作;
没有提供相关的迭代器操作。用法
通常scoped_array的创建方式是这样的:scoped_array<int> sa(new int[100]);
由于重载了[],因此用起来像个数组一样,但不能提供“数组首地址+N”的方式访问数组:sa[0] = 10; //正确
*(sa+1) = 20; //错误
使用建议
功能有限,无法实现动态增长,不能搭配STL算法,无迭代器支持,推荐使用vector而不是scoped_array。