3 资源管理
来源:互联网 发布:php实例 百度网盘 编辑:程序博客网 时间:2024/06/05 15:29
2017年8月11日 14:40:43
13 以对象管理资源
把资源放进对象,利用对象的析构函数,自动释放资源
可以使用“智能指针”来管理资源,标准库中提供 auto_ptr
由于 auto_ptr 被销毁时,会自动删除它所指的空间,所以不要让多个 auto_ptr指向同一个空间。
为了防止这个问题,auto_ptr 有一个规则:当使用copy构造和 赋值运算符时,他们就会变成 NULL,
而复制所得的指针将取得资源的唯一拥有权。
auto_ptr的代替方案:“计数型智能指针”(RCSP),持续追踪共有多少对象指向某笔资源,并在无人
指向它时自动删除该资源。有些类似垃圾回收,但是RCSP无法打破环状引用。
tr1::shared_ptr 就是一个RCSP
注意:shared_ptr 和 auto_ptr 在其析构函数内,只做delete,不做 delete []动作
因此不要用智能指针,指向数组
14 在资源管理类中小心copying行为
在复制RAII对象(资源获取就初始化的对象)时,要一并复制它所管理的资源,资源的copying行为决定RAII对象的copying行为。
常见的RAII class copying行为是:
* 禁止copy
* 施行引用计数法(用shared_ptr管理类内资源)
* 深拷贝
* 转移底部资源的拥有权
15 在资源管理类中提供对原始资源的访问
operator int() const 类重载 强制类型转换
{
...
}
一般来说,智能指针会提供 get() 方法,来获取原始资源,所以我们在编写时,也可以使用类似的方法
16 成对使用new和delete时,采用相同形式
new ---- delete
new [] ---- delete []
如果有这样两个函数:
int func1(); 17 以独立语句将newed对象置入智能指针
void func2(std::tr1::shared_ptr<MyClass> pw, int t);
现在这样调用:
func2(new MyClass(), func1());
错误,因为shared_ptr禁止隐式转换(explicit),而它又需要一个原始指针,改成这样可以通过编译:
func2(std::tr1::shared_ptr<MyClass> (new MyClass() ), func1());
这样就有以下三件事要完成:
* 执行函数func1()
* 执行 new MyClass()
* 调用shared_ptr的构造函数
C++编译器,以什么样的次序,完成这些事情,弹性很大。
所以次序不确定。如果func1(),第二个执行,并且抛出异常,第一个执行 new MyClass() 返回的指针 会内存泄漏。
为了避免异常,应该以独立语句将newed对象,置入智能指针
std::tr1::shared_ptr<MyClass> pw(new MyClass());
fun2(pw,func1());
阅读全文
0 0
- 3、资源管理
- 3-资源管理
- 3 资源管理
- 信息资源管理3章节资源管理
- effective C++: 3资源管理
- Effective C++ --3 资源管理
- 资源管理
- 资源管理
- 资源管理
- 资源管理
- 资源管理
- 资源管理
- 资源管理
- 资源管理
- 资源管理
- 资源管理
- 资源管理
- 资源管理
- 简谈ICO
- HDU6015(思维题)
- JZOJ 3418. 【NOIP动态规划专题】选课
- 鸽巢原理
- Noip2012 Day1 T1 Vigenère 密码
- 3 资源管理
- mysql 视图 以及存储过程小总结
- 洗牌算法-Shuffle an Array
- ionic3+angular4动态设置入口页rootpage,根据不同的状态值来确定不同的入口页
- 命令行参数的获取
- CSS 样式书写规范
- 2017 Multi-University Training Contest
- H5面试--弹出的a和b分别是什么
- C++ 关键字