我已经阅读了一些线程,当我使用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脚本时,我遇到了分段错误
答案 0 :(得分:1)
问题是你的讲师教你C而不是C ++。他使用原始C构造来打开一个必须手动关闭的文件,而不是C ++提供的自动清理。他忘了这样做,恰当地证明了为什么使用这种结构本身就是不安全的。它也是异常不安全的,并且由于使用了C字符串,还存在潜伏在其中的其他令人不快的潜在错误,例如一个一个错误,以及 fun ,它是非重入的strtok处理
你应该重写它(或让你的讲师修复它)来使用等效的C ++构造,它会自动清理所需的所有内存和文件句柄。
代码也包含其他攻击,例如输出参数using namespace std;
等。写这篇文章的人根本不适合教C ++。你需要把它们变成装备。
答案 1 :(得分:-1)
为防止泄漏,请致电
fclose(fin);
此调用将关闭文件。
答案 2 :(得分:-1)
我看到两个问题: