精通C++资源管理-以对象管理资源
2016-07-14 17:03
337 查看
1. 以对象管理资源
我们一起来看下面一段代码,
void f()
{
Investment* pInv = createInvestment();//调用factory函数
...
delete pInv;//释放pInv所指对象
pInv = NULL;
}
上面的代码看起来,似乎没有啥问题,由factory函数动态分配了一个Investment对象,在调用函数f返回之前将它释放。但不难发现,在若干情况下f可能无法删除pInv。在"..."区域,谁能确保代码会与你所预期的那样运行。是的,这区域里可能会出现过早的return,或者出现异常等等。因此单纯依赖“f总是会执行其delete语句”是行不通的。
在effective c++中条款13,就提出将资源放进对象内。当控制流离开f,该对象的析构函数会自动释放那些资源。也即该条款中的半边想法:把资源放进对象内,我们便可依赖C++的“析构函数自动调用机制”确保资源被释放。
a. 为防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源。如,
void f()
{
auto_ptr<Investment> pInv(createInvestment());
}
void f()
{
shared_ptr<Investment> pInv(createInvestment());
}
上面的代码示范“以对象管理资源”的两个关键想法:
1). 获得资源后立刻放进管理对象
2). 管理对运用析构函数确保资源被释放。(可以思考一下这个问题,即如果资源释放运作可能导致抛出异常,这时候如何解决资源释放)
b.两个常被使用的RAII classes 分别是tr1::shared_ptr和auto_ptr。前者通常是较佳的选择,因为其copy行为比较直观。若选择auto_ptr,复制动作会使它(被复制物)指向null.
注:待分析问题, auto_ptr和shared_ptr的区别
我们一起来看下面一段代码,
void f()
{
Investment* pInv = createInvestment();//调用factory函数
...
delete pInv;//释放pInv所指对象
pInv = NULL;
}
上面的代码看起来,似乎没有啥问题,由factory函数动态分配了一个Investment对象,在调用函数f返回之前将它释放。但不难发现,在若干情况下f可能无法删除pInv。在"..."区域,谁能确保代码会与你所预期的那样运行。是的,这区域里可能会出现过早的return,或者出现异常等等。因此单纯依赖“f总是会执行其delete语句”是行不通的。
在effective c++中条款13,就提出将资源放进对象内。当控制流离开f,该对象的析构函数会自动释放那些资源。也即该条款中的半边想法:把资源放进对象内,我们便可依赖C++的“析构函数自动调用机制”确保资源被释放。
a. 为防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源。如,
void f()
{
auto_ptr<Investment> pInv(createInvestment());
}
void f()
{
shared_ptr<Investment> pInv(createInvestment());
}
上面的代码示范“以对象管理资源”的两个关键想法:
1). 获得资源后立刻放进管理对象
2). 管理对运用析构函数确保资源被释放。(可以思考一下这个问题,即如果资源释放运作可能导致抛出异常,这时候如何解决资源释放)
b.两个常被使用的RAII classes 分别是tr1::shared_ptr和auto_ptr。前者通常是较佳的选择,因为其copy行为比较直观。若选择auto_ptr,复制动作会使它(被复制物)指向null.
注:待分析问题, auto_ptr和shared_ptr的区别
相关文章推荐
- <C++略识>之内存分配
- USACO2.4.2 穿越栅栏(简单版本) (重庆一中高2018级信息学竞赛测验2) 解题报告
- 有序数组长度为N 元素出现的长度为 大于等于 N 除 4 的最小的数
- 劣质的草(USACO 美国信息学月赛)【7.13考试第一题】
- Leetcode 258. Add Digits (Easy) (cpp)
- 操作系统第四版习题答案大全
- 构造、拷贝构造、赋值
- Leetcode 263. Ugly Number (Easy) (cpp)
- C++/CLR Windows界面编程(一·)
- 《C++ Primer Plus》15.4 RTTI 学习笔记
- C语言模块化编程的例子
- C++封装MySQL C API
- 深入分析C++引用
- C语言中自带的头文件(.h)所包含的函数
- C++ STL set和multiset的使用
- HDU2952:Counting Sheep(DFS)
- 转载 C 函数的可变参数实现原理
- Java与C++的异同点总结
- C++ 比较好的四舍五入方法
- C++程序设计翻转课堂教学改革期末问卷统计