博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
条款十三 以对象管理资源
阅读量:4930 次
发布时间:2019-06-11

本文共 1269 字,大约阅读时间需要 4 分钟。

1.管理动态分配内存

void TestFun(){  int *pval = new int(0);  .... //此处省略一万代码...  delete pval;  pval = NULL; //这一边最好有,不然pval相当于执行一块被释放内存的空间,也就是野指针}

  这里涉及到动态分配内存使用后回收问题,虽然上面函数中使用到delete,但不一定能被执行到,

在代码"...."中如果有分支(if,while, switch)中有return或者中途抛出异常,函数都会中断,
delete不会被执行,这就容易造成内存泄露,如果解决这个问题,可以使用"智能指针".

2.智能指针auto_ptr对资源管理

void TestFun(){  auto_ptr
pval(new int); //智能指针指向一块int类型数据内存  .... //此处省略一万代码...}

 

  这样就不需要管pval什么时候被释放,当不使用的时候,智能指针会自动调用自身的析构函数释放对象,

不要多个智能指针指向同一个对象,这可能导致一个对象被多次释放,所以当使用auto_ptr的复制构造或者
赋值操作符函数时,自身要释放对对象的所以控制权,转交给新的智能指针

void fun(){  int *i = new int(0);  auto_ptr
ptr_1(i);  auto_ptr
ptr_2 = ptr_1; //可以auto_ptr
ptr_2(ptr_1) ,ptr_1交出对指针i的控制权给ptr_2;  //这样后不能再使用ptr_1,因为它已经失去对变量 i的控制}

 

auto_ptr不能用于数组指针,因为auto_ptr调用是delete,而不是delete[],也不能用于STL

3.引用计数型智能指针shared_ptr

通过跟踪对象,记录对象的引用次数,当次数为0时才释放内存,与auto_ptr不同的是,shared_ptr可以进行多次复制行为
并且原来的指针不交出对对象控制的权限

int *i = new int(0);std::tr1::shared_ptr
p1(i);std::tr1::shared_ptr
p2(p1); //p1还可以使用std::tr1::shared_ptr
p3 = p2; //p2还可以使用

4.这节重点不是auto_ptr和shared_ptr,而是用这两个资源管理类创建一个对象对动态分配的资源管理,实现自动释放资源,
避免忘记释放动态分配的内存而造成内存泄露

转载于:https://www.cnblogs.com/bizhu/archive/2012/07/30/2615274.html

你可能感兴趣的文章
Struts 框架 之 文件上传下载案例
查看>>
【重走Android之路】【路线篇(二)】知识点归纳
查看>>
graphviz入门
查看>>
JAVA编码(37)—— Java字符串转换为MAP对象
查看>>
jquery.validate.js 一个jQuery验证格式控件
查看>>
有表格的九九乘法表
查看>>
WPF 4 DataGrid 控件(自定义样式篇)
查看>>
改善C#程序的建议1:非用ICloneable不可的理由
查看>>
PHP的错误机制总结
查看>>
window.location
查看>>
C#实现万年历(农历、节气、节日、星座、星宿、属相、生肖、闰年月、时辰)
查看>>
使用Flex图表组件
查看>>
官网分析(英雄传奇)(如何设计网站前端)
查看>>
SSH Key的生成和使用(for git)
查看>>
html5--6-52 动画效果-过渡
查看>>
调查表与调查结果分析
查看>>
Windows系统下安装MySQL详细教程(命令安装法)
查看>>
PHP实用小程序(六)
查看>>
PDFsharp Samples
查看>>
django-cms 代码研究(八)app hooks
查看>>