练习一
以下函数完全没有检查可能的数据错误以及可能的执行失败。请指出此函数中所有可能发生错误的地方。本题并不考虑出现异常。
int *alloc_and_init(string file_name)
{
ifstream infile(file_name);
int elem_cnt;
infile >> elem_cnt;
int *pi = allocate_array(elem_cnt);
int elem;
int index = 0;
while(infile >> elem)
{
pi[index++] = elem;
}
sort_array(pi, elem_cnt);
register_data(pi);
return pi;
}
这是书中第203页的练习7.1。
我自己的答案:打开文件后,未对infile进行判断,是否打开文件成功;pi是否分配成功,未进行判断,它是否为null。
侯捷老师给的答案如下:
第一个错误便是“型别不符”。ifstream constructor 接受的参数型别是const char*而非string。这个没有注意到。解决方法是利用string的c_str member function取得其c-style字符串表现形式:
ifstream infile(file_name.c_str());
第二个错误是检查infile是否成功开启。
if ( !infile ) // 开启失败
第三个错误就是infile >> elem_cnt 可能执行失败。
如,文件内含的是文字,那么企图“读入某个数值并置于elem_cnt内”的操作便告失败。此外,文件也有可能是空的。必须检查读取是否成功。
infile >> elem_cnt;
if (! infile) // 读取失败
第四个错误int *pi = allocate_array(elem_cnt);
无论何时,当我们处理指针时,必须随时注意指针是否的确指向实际存在的对象。如果allocate_array()无法配置足够内存,pi便会被设为0,我们必须检验如下:
if ( ! pi ) // allocate_array() 没有配置到内存
需要说明的是:程序的假设是(1)elem_cnt代表文件中的元素个数;(2)数组索引值index绝不会发生溢出。但是除非我们检查,否则实在无法保证index永远不大于elem_cnt。
第一个错误和第三个错误,没有考虑到。分析看,对于“型别不符”这个问题,一直没有注意到。此外,对于读入文字,没有思考那么多。
努力学习ing……
posted on 2008-11-03 13:35
Sandy 阅读(345)
评论(0) 编辑 收藏 引用 所属分类:
c++学习