- 论坛徽章:
- 2
|
本帖最后由 OwnWaterloo 于 2010-10-29 11:33 编辑
回复 47# a1406
简单的说, 对不能处理错误的调用层次:
1. 如果不使用异常, 必须手工地检测错误, 并向上传播。
2. 如果使用异常, 可以不做任何处理, 让异常自动地向上传播。
前提是做好异常安全。
(注意, 即使不用异常, 代码依然要在出现错误的情况下作回滚, 又得手工地编写代码)
既然这帖是讨论malloc与new, 那就以内存分配为例。
假设, 一个应用程序, 对low memory的处理是这样:
1. 回滚尽可能多的未完成操作
2. 报告low memory
3. 结束进程
int main( ... )
{
try
{
Main( ... );
} catch ( std::bad_alloc& e)
{
cout<<"low memory, exit"<<endl;
return -1;
}
}
从Main开始往下, 所有的调用层次(按上面的low memory的处理策略), 按上面的low mem策略, 无须处理。
因为异常可以自动向上传播, 也无须在每个调用层次检测。
只需要保证异常安全 —— 在析构函数配合下并不难。
而如果不使用异常:
1. 每个malloc调用都必须检测
2. 然后回滚当前层次的未完成操作
3. 继续向上报告
4. 上层继续检测, 回滚, 报告 —— 报告还隐含了一点: 每个层次都和malloc有耦合了, 它们的错误里面至少有EMEM。
5. 所有这些代码, 都必须手工编写
当然, low memory是个很特殊的情况。 在low mem的情况下, 回滚操作可能不一定能完成 —— 也许回滚本身就需要请求内存。
所以上面说的是尽可能的回滚。
举malloc, 是因为大家都熟悉, 并且可以想象一下, 要达到C++的safe程度,而不是简单粗暴的if(!p) exit(1), 需要多编写多少代码? |
|