原创作品转载请注明出处
如果fopen之后不fcolse会怎样呢?
#include<stdio.h>
int main() {
FILE* fp;
fp = fopen("record.dat","w");
return 0;
}
这里声明了一个FILE类型的指针,它指向了打开的一个当前目录下的record.dat文件。这个过程其实是在内存当中多了一个FILE结构体。这种结构体当中各个字段保存着fopen的文件的信息。那如果fopen多个文件之后,并不进行fclose会不会造成内存当中产生很多的这样的结构体,造成内存泄漏呢?做一个实验验证一下。
打开1个文件:
#include<stdio.h>
int main() {
FILE* fp;
int i;
for(i=0;i<500;i++) {
fp = fopen("record.dat","w");
if(1==i) {
system("pause");
}
}
return 0;
}
打开500个文件:
#include<stdio.h>
int main() {
FILE* fp;
int i;
for(i=0;i<500;i++) {
fp = fopen("record.dat","w");
if(499==i) {
system("pause");
}
}
return 0;
}
很明显,多打开了499个文件,内存多用了196K。
这个小程序也可以写成这样,然后同时打开任务管理器,在cmd当中按一下键,内存当中就会多一个结构体,按理说应该会看到任务管理器当中这个进程占用的内存在不断变大,但是不知道为什么一直是波动。
#include<stdio.h>
int main() {
FILE* fp;
int i;
for(i=0;i<500;i++) {
char c[50];
sprintf(c,"record%d.dat",i);
fp = fopen(c, "w");
system("pause");
}
return 0;
}
另外还有一个问题就是,当循环的范围比较大时,当前目录下并没有生成那么多文件。然后就修改了一下程序:
#include<stdio.h>
int main() {
FILE* fp;
int i;
for(i=0;i<1000;i++) {
char c[50];
sprintf(c,"record%d.dat",i);
while(( fp = fopen(c, "w") )== NULL) ;
if(999==i) {
system("pause");
}
}
return 0;
}
运行之后发现到该生成第509个文件的时候进入了死循环。刚开始以为系统目录下文件的数量是有限制的。。。可能程序运行过程当中fopen的文件个数是有限制的?
反正不管怎样,在写程序的过程中要养成良好的习惯,fopen后要记得fclose,malloc之后要记得free,new之后要记得delete. 避免出现内存泄漏的问题。