内存管理是一个比较繁琐的问题,C++中有两个实现方案: 垃圾回收机制智能指针。垃圾回收机制因为性能等原因不被C++的大佬们推崇, 而智能指针被认为是解决C++内存问题的最优方案。

     一个智能指针就是一个C++的对象, 这对象的行为像一个指针,但是它却可以在其不需要的时候自动删除。注意这个“其不需要的时候”, 这可不是一个精确的定义。这个不需要的时候可以指好多方面:局部变量退出函数作用域、类的对象被析构……。所以boost定义了多个不同的智能指针来管理不同的场景。

shared_ptr<T> 内部维护一个引用计数器来判断此指针是不是需要被释放。是boost中最常用的智能指针了。
scoped_ptr<t> 当这个指针的作用域消失之后自动释放
intrusive_ptr<T> 也维护一个引用计数器,比shared_ptr有更好的性能。但是要求T自己提供这个计数器。
weak_ptr<T> 弱指针,要和shared_ptr 结合使用
shared_array<T> 和shared_ptr相似,但是访问的是数组
scoped_array<T> 和scoped_ptr相似,但是访问的是数组

2. Boost::scoped_ptr<T>

2.1 定义

    scoped_ptr 是boost中最简单的智能指针。scoped_ptr的目的也是很简单, 当一个指针离开其作用域时候,释放相关资源。特别注意的一定就是scoped_ptr 不能共享指针的所有权不能转移所有权。也就是说这个内存地址就只能给的声明的变量用,不能给其他使用。

2.2 特点

(1)scoped_ptr的效率和空间的消耗内置的指针差不多

(2)scoped_ptr不能用于管理数组对象,不能指向一块能够动态增长的内存区域(用scoped_array代替)

(3)scoped_ptr不能转换所有权,因此不能作为函数的返回值

(4)scoped_ptr不能共享所有权,因此不能用于stl的容器中(用shared_ptr代替)

2.3 使用原则

(1)在可能有异常抛出的作用域使用指针

(2)函数里有几条控制路径

(3)动态分配对象的生存期应被限制于特定的作用域内

(4)异常安全非常重要时(总应如此!)

2.4 例子

 1 class test 
 2 { 
 3 public: 
 4     void print() 
 5     { 
 6         cout << "test print now" <<endl; 
 7     } 
 8 };
 9 int _tmain(int argc, _TCHAR* argv[]) 
10 { 
11     boost::scoped_ptr<test> x(new test); 
12     x->print(); 
13     return 0; 
14 }
View Code

相关文章:

  • 2022-01-28
  • 2022-03-04
  • 2022-02-04
  • 2021-07-13
  • 2022-03-11
猜你喜欢
  • 2021-05-24
  • 2021-07-04
  • 2021-06-27
  • 2022-12-23
  • 2021-05-20
  • 2021-08-30
相关资源
相似解决方案