Effective c++ 读书笔记2
来源:互联网 发布:淘宝红包使用规则 编辑:程序博客网 时间:2024/05/22 13:12
条款13 以对象管理资源
将指向资源的指针放进一个资源管理对象中,这样在资源管理对象析构的时候,资源就能保证被释放。
获得资源后立刻放进管理对象内,以防在期间发生异常,导致资源泄漏。
常用的资源管理对象有std::tr1::shared_ptr(c++11中为std::shared_ptr)和std::auto_ptr。
条款14 在资源管理类中小心copying行为
设计一个RAII类(如shared_ptr和auto_ptr)时需要考虑,当一个RAII对象被复制时,会发生什么事情?两种常见选择:
- 禁止复制
- 对底层资源使用“引用计数”
同时,还需要考虑是否复制底部资源,即是否深度复制。
条款15 在资源管理类中提供对原始资源的访问
API往往要求访问原始资源(如指向资源的指针),所以每一个RAII类应该提供一个“取得其所管理资源”的方法。一般有两类方法:
- 提供一个 显示转换函数,如GetPtr()
- 使用隐式转换函数
class Smart_Prt{public: ... operator A() const { return m_pointer; } ...private: ... A* m_pointer; ...};
两种方法各有利弊,一般而言显示转换更加安全,而隐式转换对用户比较方便。个人觉得尽量使用显示转换。
条款16 成对使用new和delete时要求采取相同形式
new和delete,new [] 和 delete [] 要正确配对。
小心typedef把 [] 信息隐藏掉
typedef std::string AddressLines[4];...std::string* pal = new AddressLines;...delete [] pal;
条款17 以独立语句将new出来的对象放进智能指针
考虑如下情况:
int priority();void processWidget(std::tr1::shared_ptr<Widget> pw, int priority);...//现在调用processWidget:processWidget(std::tr1::shared_ptr<Widget>(new Widget), priority());
在调用processWidget()之前,需要完成:
- 执行“new Widget”
- 调用“tr1::shared_ptr构造函数”
- 调用“priority“
c++编译器完成上面的三个步骤的顺序弹性很大,调用顺序可以任意组合,只要满足”new Widget”先于”tr1::shared_ptr即可”。
如果priority排在第二位,先执行”new Widget”,再调用priority,执行priority过程中发生异常,那么,获取到的资源还没来得及放进智能指针里,就会造成资源泄漏。
为了避免这种情况发生,应该这样写:
std::tr1::shared_ptr<Widget> pw(new Widget);processWidget(pw, priority());
请用独立语句将new出来的对象放入智能指针内。如果不这样做,一旦异常抛出,有可能导致难以察觉的资源泄漏。
0 0
- Effective C++(2)读书笔记
- 《effective c++》读书笔记2
- <Effective C++>读书笔记-2
- Effective-Objective-C-读书笔记-Item-2
- Effective Object-c 2.0 读书笔记 (2)
- <<More Effective C++>>读书笔记2: 运算符
- <<More Effective C++>>读书笔记5: 技巧(2)
- <<Effective C++>>读书笔记(2)
- 《Effective C++》读书笔记
- 《Effective C++》读书笔记
- 《Effective c++》读书笔记
- 《more effective c++》读书笔记
- <<effective c++>> 读书笔记
- 《Effective C++》读书笔记
- 《Effective C++》读书笔记
- Effective C++(1)读书笔记
- 《Effective C++》读书笔记
- 《Effective C++》读书笔记
- 输入20个实数存放在一维数组中,输出它们的平均值以及高于平均的数的个数
- 原来scala函数参数定义=>左边可以不加参数,表示无参,并且可以用大括号代替小括号
- Android实现点击支付按钮,弹起自定义输入法进行密码输入
- 线程池的理解及使用
- 封装ajax工具函数
- Effective c++ 读书笔记2
- 从get请求的URL获取返回流
- ultraedit字体大小设置快捷键
- java8函数式编程之一:@FunctionalInterface注解
- 【BZOJ 4300】绝世好题 递推
- Django学习笔记_PIP使用
- 我的收藏
- 文章标题
- 关于百度网盘的问题解答(帮助中心)