effective c++ 条款13 use object to manage resources.
请求的系统资源需要最终还回系统,为了避免遗忘返还这个动作,可以利用析构函数在object销毁时自动调用的特点来实现。
简单说就是用object来管理资源。
以内存资源为例
class Investment {};
Investment* creatInvestment(){...} // factory function to produce investment object
void main()
{
Investment* pInv = creatInvestment();//call to get investment object
....
delete pInv; // sometime we forget this, happens
}
//solution
void main()
{
stid::auto_ptr<Investment> pInv(creatInvestment());
...
}//when pInv is destroied, auto_ptr will be released.
//problem with auto_ptr
//only one auto_ptr can point to one object
//if auto_ptr was assgined to another auto_ptr
//original auto_ptr would be null
//see following example:
void main()
{
stid::auto_ptr<Investment> pInv1(creatInvestment());
stid::auto_ptr<Investment> pInv2(pInv1); //pInv1 null
pInv1 = pInv2;//pInv2 null
...
}
所以使用auto_ptr 在赋值或者复制时会产生问题。我们并不希望赋值以后就把原来的指针变成null
替代方案是使用
void main()
{
stid::shared_ptr<Investment> pInv1(creatInvestment()); stid::shared_ptr<Investment> pInv2(pInv1); //pInv1 null pInv1 = pInv2;//pInv2 null
...
}
在拷贝时完全不会发生问题。需要注意的是在auto_ptr, shared_ptr中使用的是delete 而不是delete[]
如果我们
stid::shared_ptr<Investment> pInv1(new char[10]);
会产生问题。
effective c++ 条款13 use object to manage resources.的更多相关文章
- Effective C++ Item 13 Use object to manage resources
1. Always use object to manage resource! If you delete a pointer or release a handler manually by yo ...
- Effective C++ -----条款13:以对象管理资源
为防止资源泄漏,请使用RAII(Resource Acquisiton Is Initialization) 对象,它们在构造函数中获得资源并在析构函数中释放资源. 两个常被使用的RAII class ...
- Effective C++ 条款13/14 以对象管理资源 || 在资源管理类中小心拷贝行为
三.资源管理 资源就是一旦你使用了它,将来不用的时候必须归还系统.C++中最常用的资源就是动态内存分配.其实,资源还有 文件描述符.互斥器.图形界面中的字形.画刷.数据库连接.socket ...
- Effective C++ 条款13
以对象管理资源 资源的种类非常多,动态分配的内存.文件描写叙述器.相互排斥锁.图像界面中画刷.数据库连接.网络socket等. 资源通常是有限的.当你不用时,必须释放.不然就会造成资源浪费.更严重的情 ...
- 《Effective C++》学习笔记条款13 以对象管理资源
条款 13 :以对象管理资源 例: voidf() { Investment *pInv = createInvestment(); ... ...
- EC读书笔记系列之8:条款13、14、15
条款13 以对象管理资源 记住: ★为防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放 ★两个常被使用的RAII classes分别是tr1::shared_ptr和aut ...
- [More Effective C++]条款22有关返回值优化的验证结果
(这里的验证结果是针对返回值优化的,其实和条款22本身所说的,考虑以操作符复合形式(op=)取代其独身形式(op),关系不大.书生注) 在[More Effective C++]条款22的最后,在返回 ...
- More Effective C++ 条款0,1
More Effective C++ 条款0,1 条款0 关于编译器 不同的编译器支持C++的特性能力不同.有些编译器不支持bool类型,此时可用 enum bool{false, true};枚举类 ...
- Effective C++ Item 15 Provide access to raw resources in resource-managing classes
In last two item, I talk about resource-managing using RAII, now comes to the practical part. Often, ...
随机推荐
- 慕尼黑大学公开课 Competitive Strategy(竞争策略)总结
第一章博弈 同时的博弈:双方同时定制策略 如果有显著的次优策略总是不如另一个,则剔除它. 如果一个策略组合中没有一方可以单独改变其策略以提高回报,则称为Nash均衡.一个游戏可能没有也可能有多个Nas ...
- 1-5html文件基本结构
认识html文件基本结构 1)这一节中我们来学习html文件的结构:一个HTML文件是有自己固定的结构的. <html> <head>...</head> < ...
- c++程序猿经典面试题
1.请问i的值会输出什么? #include"iostream.h" int i=1; void main() { int i=i; cout<<i<<en ...
- 让window命令行支持自己主动补全[相似Linux的Tab键]
打开注冊表,找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor下 项"CompletionChar"(REG_DWO ...
- C#文件流写入方法
stream为服务端接收的文件流 var bytes = new byte[stream.Length]; stream.Read(bytes, 0, bytes.Length); // 设置当前流的 ...
- Hadoop Spark 集群简便安装总结
本人实际安装经验,目的是为以后高速安装.仅供自己參考. 一.Hadoop 1.操作系统一如既往:①setup关掉防火墙.②vi /etc/sysconfig/selinux,改SELINUX=disa ...
- win7下硬盘安装win7+linuxUbuntu双系统方法
Linux安装大致介绍: win7下硬盘安装win7+linuxUbuntu双系统方法 原则: 所有的看完在装,请仔细看 一 条件: 1. 系统选择 linux unbuntu12.04.2-desk ...
- 通过Java反射调用方法
这是个测试用的例子,通过反射调用对象的方法. TestRef.java import java.lang.reflect.Method; import java.lang.reflect.In ...
- 【android自己定义控件】自己定义View属性
1.自己定义View的属性 2.在View的构造方法中获得我们自己定义的属性 3.重写onMesure 4.重写onDraw 3这个步骤不是必须,当然了大部分情况下还是须要重写的. 1.自己定义Vie ...
- zoj 3822 Domination (可能性DP)
Domination Time Limit: 8 Seconds Memory Limit: 131072 KB Special Judge Edward is the headm ...