我收到资源泄漏:代码以前工作时fin错误

时间:2014-06-19 16:25:07

标签: c++ memory-leaks cygwin

我已经阅读了一些线程,当我使用cppcheck时,当我弹出此错误时,我应该关闭某个文件。但我的问题是:

2周后,我运行了一个shell脚本,调用其中的另一个文件来执行,它工作正常。 但是在过去的两天里,我在使用Cygwin运行主代码时遇到了分段错误。我之前发布过它,然后使用cppcheck分析可执行文件(在cpp中),我得到了第31行资源泄漏:fin。

粘贴了这段特殊代码:

void load_fasta_list(char * file_name, vector<string> &file_list){
FILE * fin;
fin = fopen(file_name, "rt");
char temp_file[512];
char * temp_file2;
while (!feof(fin)){
    fgets(temp_file, 512, fin);   
    if (!feof(fin)){
        temp_file2 = strtok(temp_file, "\n");
        file_list.push_back(temp_file2);
    }
}
cout<<file_list.size()<<" FASTA files to be analyzed."<<endl;   

}

第31行是那里的最后一个括号。 这些代码可以从华盛顿U获得,我正在使用(我是初学者),我收到此错误而没有对代码集做任何事情。

关于如何进步的任何想法?

P.S。当我尝试使用fclose语句时,cppcheck没有显示任何错误,但是当我再次运行shell脚本时,我遇到了分段错误

3 个答案:

答案 0 :(得分:1)

问题是你的讲师教你C而不是C ++。他使用原始C构造来打开一个必须手动关闭的文件,而不是C ++提供的自动清理。他忘了这样做,恰当地证明了为什么使用这种结构本身就是不安全的。它也是异常不安全的,并且由于使用了C字符串,还存在潜伏在其中的其他令人不快的潜在错误,例如一个一个错误,以及 fun ,它是非重入的strtok处理

你应该重写它(或让你的讲师修复它)来使用等效的C ++构造,它会自动清理所需的所有内存和文件句柄。

代码也包含其他攻击,例如输出参数using namespace std;等。写这篇文章的人根本不适合教C ++。你需要把它们变成装备。

答案 1 :(得分:-1)

为防止泄漏,请致电

fclose(fin);

此调用将关闭文件。

答案 2 :(得分:-1)

我看到两个问题:

  1. 检查fin是否有效(如果文件不存在,fopen返回null!)
  2. 使用fclose(fin)关闭文件