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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template <typename T>
class scoped_ptr
{
private:
T* px;
scoped_ptr(scoped_ptr const &); //C++11可将函数声明为delete
scoped_ptr& operator=(scoped_ptr const &);
public:
explicit scoped_ptr(T* p = 0);
explicit scoped_ptr(std::auto_ptr<T> p);
~scoped_ptr();
void reset(T* p = 0);
T& operator*() const;
T* operator-> const;
T* get() const;
operator bool() const; //重载了bool转换
void swap(scoped_ptr& b);
}
  • 类解析
    通过将拷贝构造函数和拷贝赋值运算符声明为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
2
3
4
5
6
7
8
9
10
11
12
template <tyname T>
class scoped_array
{
public:
explicit scoped_array(T* p = 0);
~scoped_array();
void reset(T* p = 0);
T& operator[](std::ptrdiff_t i) const;
T* get() const;
operator bool() const;
void swap(scoped_array& b);
}
  • 类解析
    接受的指针必须是new[]的结果,不能是new的结果;
    没有重载*和->操作符;
    析构函数调用的是delete[],而不是delete;
    提供了[]操作符,可以像数组一样操作;
    没有提供相关的迭代器操作。

  • 用法
    通常scoped_array的创建方式是这样的:
    scoped_array<int> sa(new int[100]);
    由于重载了[],因此用起来像个数组一样,但不能提供“数组首地址+N”的方式访问数组:
    sa[0] = 10; //正确
    *(sa+1) = 20; //错误

  • 使用建议
    功能有限,无法实现动态增长,不能搭配STL算法,无迭代器支持,推荐使用vector而不是scoped_array。