boost智能指针的使用.docx_第1页
boost智能指针的使用.docx_第2页
boost智能指针的使用.docx_第3页
boost智能指针的使用.docx_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1. 定义一个智能指针就是一个C+的对象, 这对象的行为像一个指针,但是它却可以在其不需要的时候自动删除。注意这个“其不需要的时候”,这可不是一个精确的定义。这个不需要的时候可以指好多方面:局部变量退出函数作用域、类的对象被析构。所以boost定义了多个不同的智能指针来管理不同的场景。shared_ptr内部维护一个引用计数器来判断此指针是不是需要被释放。是boost中最常用的智能指针了。scoped_ptr当这个指针的作用域消失之后自动释放intrusive_ptr也维护一个引用计数器,比shared_ptr有更好的性能。但是要求T自己提供这个计数器。weak_ptr弱指针,要和shared_ptr 结合使用shared_array和shared_ptr相似,但是访问的是数组scoped_array和scoped_ptr相似,但是访问的是数组2. Boost:scoped_ptrscoped_ptr 是boost中最简单的智能指针。scoped_ptr的目的也是很简单,当一个指针离开其作用域时候,释放相关资源。特别注意的一定就是scoped_ptr 不能共享指针的所有权也不能转移所有权。也就是说这个内存地址就只能给的声明的变量用,不能给其他使用。下面是scoped_ptr的几个特点:scoped_ptr的效率和空间的消耗内置的指针差不多。scoped_ptr不能用在标准库的容器上。(用shared_ptr代替)scoped_ptr 不能指向一块能够动态增长的内存区域(用scoped_array代替)1. classtest 2. 3. public: 4. voidprint() 5. 6. couttestprintnowendl; 7. 8. ; 9. int_tmain(intargc,_TCHAR*argv) 10. 11. boost:scoped_ptrx(newtest); 12. x-print(); 13. return0; 14. 3.Boost:shared_ptrshared_ptr 具有如下几个特点:1.在内部维护一个引用计数器, 当有一个指针指向这块内存区域是引用计数+1, 反之-1, 如果没有任何指针指向这块区域,引用计数器为0,释放内存区域。2.可以共享和转移所有权。3.可以被标准库的容器所使用4.不能指向一块动态增长的内存(用share_array代替)我们可以看下如下例子:1. int_tmain(intargc,_TCHAR*argv) 2. 3. boost:shared_ptrptr_1(newtest); 4. ptr_1-print();/引用计数为1 5. boost:shared_ptrptr_2=ptr_1; 6. ptr_2-print();/引用计数为2 7. ptr_1-print();/引用计数还是为2 8. return0; 9. 4. Boost:intrusive_ptrintrusive_ptr 的主要和share_ptr一样,对比share_ptr,其效率更高,但是需要自己维护一个引用计数器, 这里不做详细介绍。5. Boost:weak_ptrweak_ptr 就是一个弱指针。weak_ptr 被shared_ptr控制,它可以通过share_ptr的构造函数或者lock成员函数转化为share_ptr。weak_ptr的一个最大特点就是它共享一个share_ptr的内存,但是无论是构造还是析构一个weak_ptr 都不会影响引用计数器。1. int_tmain(intargc,_TCHAR*argv) 2. 3. boost:shared_ptrsharePtr(newtest); 4. boost:weak_ptrweakPtr(sharePtr); 5. /weakPtr就是用來保存指向這塊內存區域的指針的 6. /干了一大堆其他事情 7. boost:shared_ptrsharePtr_2=weakPtr.lock(); 8. if(sharePtr_2) 9. sharePtr_2-print(); 10. return0; 11. 6. Boost:shared_array 和Boost:scoped_array前面提到过shared_ptr和scoped_ptr不能用于数组的内存(new ),所以shared_array和scoped_array就是他们的代替品。我们可以看下shared_array的用法1. int_tmain(intargc,_TCHAR*argv) 2. 3. constintsize=10; 4. boost:shared_arraya(newtest); 5. for(inti=0;isize;+i) 6. ai.print(); 7. return0; 8. 7. 使用智能指针的几个注意点下面是几个使用智能指针需要注意的地方:1.声明一个智能指针的时候要立即给它实例化,而且一定不能手动释放它。_ptr 不是T* 类型。所以:a: 声明的时候要_ptr 而不是._ptrb:不能把T* 型的指针赋值给它c: 不能写ptr=NULl, 而用ptr.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论