程序读取一个5M的文本,居然占用了50+M的内存……请问这是为什么?……
如题,我在练习用单向链表解决读取不确定个数的数据问题。
结构很简单如下所示:
typedef struct Node{
int num;
struct Node *next;
}
由于最开始我觉得自己写的append都要在调用时循环指到最后一个节点太不效率了,所以我用了一个“从尾巴开始加起”的这个思路解决增加节点的问题:
实现如下:
/*当读取节点的时候,每次都通过node的下一个追加,可以节省无数次遍历所用的时间*/
void file_append(NODE **node,int num) {
if (!*node) {
return;
}
NODE *temp = create_empty();
temp->num = num;
(*node)->next = temp;
/*这样应该保证每次node都是最后一个节点*/
(*node) = (*node)->next;
}
int file_input(NODE *HEAD,const char *filename) {
if (!HEAD) {
return 0;
}
NODE *tail = HEAD;
while (tail->next) {
tail = tail->next;
}
/*这样一来,tail最终指向了最后一个节点*/
FILE *fp = fopen(filename, "r");
if (!fp) {
return 0;
}
while (!feof(fp)) {
int num;
fscanf(fp, "%d", &num);
file_append(&tail, num);
}
fclose(fp);
return 1;
}
释放内存的部分就是一个个删除,为了便于读懂我多写了个delete_node:
/*删除指定节点*/
int delete_node(NODE *node) {
if (!node) {
return 0;
}
memset(node, 0, sizeof(node));
free(node);
return 1;
}
/*清空链表所有下级节点*/
int remove_all_nodes(NODE *HEAD) {
if (!HEAD) {
return 0;
}
NODE *cur = HEAD;
NODE *temp = NULL;
while (cur) {
temp = cur->next;
cur->next = cur->next->next;
delete_node(temp);
cur = cur->next;
}
return 1;
}
/*打印指定节点的数据*/
void print_node(NODE *node) {
printf("%d ",node->num);
}
/*打印整个链表的数据*/
void print_chaintab(NODE *HEAD) {
NODE *temp = HEAD->next;
while (temp) {
print_node(temp);
temp = temp->next;
}
printf("\n");
}
其它部分就都不相关了,也就没有详细列出来。
int main(int argc,char *argv[]) {
if (argc < 2) {
printf("请指明文件名\n");
getchar();
return 1;
}
printf("开始读取文件……");
getchar();
NODE *head = create_empty();
clock_t start, end;
start = clock();
if(!file_input(head, argv[1])){
printf("文件不存在!\n");
getchar();
return 2;
}
end = clock();
printf("文件加载完毕!共耗时%d毫秒。\n",end - start);
/*print_chaintab(head);*/
getchar();
remove_all_nodes(head);
free(head);
printf("记录清除完毕……");
getchar();
return 0;
}
之后我自己生成了一个放满随机数(大约100万个)的文本文件,大小为5.39M。
在代码中可以看到:我分别在main的读取前,读取后和内存清理前设置了getchar()来观察内存变化。
于是问题来了:
读取文件前,程序只占用了572K的内存
读取完所有记录居然有将近54M的占用
而释放后内存占用居然还没变……
请问:
1、为什么内存占用了50多M?这已经相当于是文件大小的10倍多了
2、到底我的清除链表有没有完成任务?这些内存是否已经被清除掉了?
3、为什么清除后的程序没有恢复到500多K?如何让它恢复成初始大小?
新来的用户,应该没有多少分,所以先来10分。希望各位前辈指点迷津,谢谢!