今天调试代码出现一个“耐人寻味”的Bug。程序的一个读写文件的函数被频繁调用,一两千还没问题,当运行到第2972调用时,出现问题。后来Car仔细检查,发现在这个函数中,有这样的代码
...
FILE *fp=fopen("xxx", "rb+");
if(fp==NULL)
{ cerr<<"Error."<
int len=ftell(fp);
rewind(fp);
if(len != 112)
{
return; //隐含的一个BUG
}
在这个函数中,标注的一句造成文件没有正常关闭,文件句柄占用资源。而Windows的文件句柄资源是有限的。我们的程序在大量的数据下测试下,提示文件打不开了,暴露出这个隐含的BUG。
这个BUG比较隐蔽,一般不会引人注意。以后应用文件、内存等资源时,一定要注意用完后释放资源。较好的方法是将操作封装成一个类,再类的析构函数中放置释放资源的操作,避免类似的BUG。
void Test()
{
ifstream inOriginal("d:\\victor\\irpos\\test\\test4000\\original.txt");
LoadOriginal(inOriginal, vecOriginal);
inOriginal.close();
vector
for(i=vecOriginal.begin(); i!=vecOriginal.end(); i++)
{
cout<<(*i)<
//////
}
其中LoadOriginal的声明为
bool LoadOriginal(vector
运行时,到函数结束时,出现一个异常。调试的时候发现inOriginal析构出现错误,百思不得其解。
然后将ifstream inOriginal移入LoadOriginal内部,程序运行正常。太奇怪了。
我用的是Visual C++ 6.0(SP5),会不会是其搭配的STL有问题?
太棒了。在Car的帮助下,我用上了Blog。感觉非常不错!
以后可以经常将自己的一些想法、感悟写在上面,像记日记一样。挺新鲜。
Blog在中国才刚刚开始,“博客”好像还不多,我得了解一下这方面的内容。