boost智能指针的使用

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1. 定义

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

2. Boost::scoped_ptr

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

下面是scoped_ptr的几个特点:

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

scoped_ptr不能用在标准库的容器上。(用shared_ptr代替)

scoped_ptr 不能指向一块能够动态增长的内存区域(用scoped_array代替)

1.class test

2.{

3.public:

4. void print()

5. {

6. cout << "test print now" <

7. }

8. };

9. int _tmain(int argc, _TCHAR* argv[])

10.{

11.boost::scoped_ptr x(new test);

12. x->print();

13. return 0;

14.}

3.Boost::shared_ptr

shared_ptr 具有如下几个特点:

1.在内部维护一个引用计数器,当有一个指针指向这块内存区域是引用计数+1,反之-1,如果没有任何指针指向这块区域,引用计数器为0,释放内存区域。

2.可以共享和转移所有权。

3.可以被标准库的容器所使用

4.不能指向一块动态增长的内存(用share_array代替)

我们可以看下如下例子:

1.int _tmain(int argc, _TCHAR* argv[])

2.{

3.boost::shared_ptr ptr_1(new test);

4. ptr_1->print();//引用计数为1

5. boost::shared_ptr ptr_2 = ptr_1;

6. ptr_2->print();//引用计数为2

7. ptr_1->print();// 引用计数还是为2

8. return 0;

4. Boost::intrusive_ptr

intrusive_ptr 的主要和share_ptr一样,对比share_ptr,其效率更高,但是需要自己维护一个引用计数器,这里不做详细介绍。

5. Boost::weak_ptr

weak_ptr 就是一个弱指针。weak_ptr 被shared_ptr控制,它可以通过share_ptr的构造函数或者lock成员函数转化为share_ptr。

weak_ptr的一个最大特点就是它共享一个share_ptr的内存,但是无论是构造还是析构一个weak_ptr 都不会影响引用计数器。

1.int _tmain(int argc, _TCHAR* argv[])

2. {

3. boost::shared_ptr sharePtr(new test);;

4. boost::weak_ptr weakPtr(sharePtr);

5. //weakPtr 就是用來保存指向這塊內存區域的指針的

6. //干了一大堆其他事情

7. boost::shared_ptr sharePtr_2 = weakPtr.lock();

8. if (sharePtr_2)

9. sharePtr_2->print();

10. return 0;

11. }

6. Boost::shared_array 和Boost::scoped_array

前面提到过shared_ptr和scoped_ptr不能用于数组的内存(new []),所以shared_array和scoped_array就是他们的代替品。我们可以看下shared_array的用法

1.int _tmain(int argc, _TCHAR* argv[])

3. const int size = 10;

4. boost::shared_array a(new test[]);

5. for (int i = 0; i < size; ++i)

6. a[i].print();

7. return 0;

8.}

7. 使用智能指针的几个注意点

下面是几个使用智能指针需要注意的地方:

1.声明一个智能指针的时候要立即给它实例化,而且一定不能手动释放它。…_ptr 不是T* 类型。所以:

a: 声明的时候要…_ptr 而不是….._ptr

b:不能把T* 型的指针赋值给它

c: 不能写ptr=NULl, 而用ptr.reset()代替。

1.不能循环引用。

2.不要声明临时的share_ptr,然后把这个指针传递给一个函数

8. 总结

智能指针使用上还是比较简单的,而且能比较有效得解决C++内存泄露的问题,各位使用C++的童鞋赶快用起来吧。

相关文档
最新文档