为什么分配的内存没有被释放
Why is allocated memory not getting freed
我遇到了问题,我真的不知道为什么会这样,怎么会这样。我会尽可能多地解释自己。
代码有两个函数:main 和 assemble。在 main 中,我只获取一些文档文件方向的参数,并将每个参数发送到 assemble 函数。
在 assemble 函数中我打开文件,然后我启动一个链表,我找到第一个节点的内存,然后我向列表添加很多节点(那部分我没有将它复制到这里,因为它很大但它工作正常)然后在最后我关闭文件并释放链接列表。
这是代码:
typedef struct node {
int location;
char name[MAX_LABEL];
char type;
struct node * next;
} labVar;
int main(int argc, char *argv[]) {
if (argc == 1)
printf("No file attached./n");
else {
while(--argc) {
argv++;
assemble(*argv);
}
}
return 0;
}
void assemble(char *file) {
FILE *iofp;
int i = 0;
labVar *nodeLabHead = NULL; /* initializing head of the labels' linked list */
labVar *nodeLabCurr = NULL; /* variable to go through the list */
if ((iofp=fopen(file,"r")) == NULL)
printf("\nCan't open file \"%s\"\n", file);
else {
printf("\nSuccess opening %s\n", file);
nodeLabHead = (labVar *) malloc(sizeof(labVar));
if (nodeLabHead == NULL) {
printf("\nNo memory to allocate.\n");
exit(0);
}
/*HERE I FILL THE LINKED LIST WITH MANY NODES IN ANOTHER FUNCTION, IT WORKS*/
fclose(iofp);
while (nodeLabHead->next != NULL) {
nodeLabCurr = nodeLabHead;
nodeLabHead = nodeLabHead->next;
free(nodeLabCurr);
}
free(nodeLabHead);
}
}
因此,对于我作为参数发送的所有类型的文件,代码似乎都运行良好。但是,当我尝试 运行 具有多个参数的代码(为每个参数调用 append 函数)时,它进入了无限循环。我知道它与释放内存有关,因为它陷入了那个循环。如果删除最后一行 (free(nodeLabHead);) 它只会在我输入节点较多的文件然后输入节点较少的文件时卡住,否则它会起作用。
我也注意到了,一开始给第一个节点分配内存的时候,nodeLabHead->next==NULL returns 1 和预期的一样,但是第二次到了(与第二个文件,nodeLabHead->next==NULL returns 0,这意味着它并没有真正被释放,我不明白为什么。
您没有显示您的代码,但听起来您从未将 nodeLabHead->next 初始化为 NULL,因此它包含分配的内存中的任何内容。碰巧你第一次调用你的函数时,它是 0,但后来它不是。
您从 malloc
取回的内存未初始化——因此可能包含任何内容。如果您希望它具有可预测的值,则需要显式设置结构的每个字段。
尝试将 malloc
调用更改为 calloc
,或者在 malloc
调用之后添加一个 memset(nodeLabHead, 0, sizeof(labVar))
。
我遇到了问题,我真的不知道为什么会这样,怎么会这样。我会尽可能多地解释自己。
代码有两个函数:main 和 assemble。在 main 中,我只获取一些文档文件方向的参数,并将每个参数发送到 assemble 函数。
在 assemble 函数中我打开文件,然后我启动一个链表,我找到第一个节点的内存,然后我向列表添加很多节点(那部分我没有将它复制到这里,因为它很大但它工作正常)然后在最后我关闭文件并释放链接列表。
这是代码:
typedef struct node {
int location;
char name[MAX_LABEL];
char type;
struct node * next;
} labVar;
int main(int argc, char *argv[]) {
if (argc == 1)
printf("No file attached./n");
else {
while(--argc) {
argv++;
assemble(*argv);
}
}
return 0;
}
void assemble(char *file) {
FILE *iofp;
int i = 0;
labVar *nodeLabHead = NULL; /* initializing head of the labels' linked list */
labVar *nodeLabCurr = NULL; /* variable to go through the list */
if ((iofp=fopen(file,"r")) == NULL)
printf("\nCan't open file \"%s\"\n", file);
else {
printf("\nSuccess opening %s\n", file);
nodeLabHead = (labVar *) malloc(sizeof(labVar));
if (nodeLabHead == NULL) {
printf("\nNo memory to allocate.\n");
exit(0);
}
/*HERE I FILL THE LINKED LIST WITH MANY NODES IN ANOTHER FUNCTION, IT WORKS*/
fclose(iofp);
while (nodeLabHead->next != NULL) {
nodeLabCurr = nodeLabHead;
nodeLabHead = nodeLabHead->next;
free(nodeLabCurr);
}
free(nodeLabHead);
}
}
因此,对于我作为参数发送的所有类型的文件,代码似乎都运行良好。但是,当我尝试 运行 具有多个参数的代码(为每个参数调用 append 函数)时,它进入了无限循环。我知道它与释放内存有关,因为它陷入了那个循环。如果删除最后一行 (free(nodeLabHead);) 它只会在我输入节点较多的文件然后输入节点较少的文件时卡住,否则它会起作用。
我也注意到了,一开始给第一个节点分配内存的时候,nodeLabHead->next==NULL returns 1 和预期的一样,但是第二次到了(与第二个文件,nodeLabHead->next==NULL returns 0,这意味着它并没有真正被释放,我不明白为什么。
您没有显示您的代码,但听起来您从未将 nodeLabHead->next 初始化为 NULL,因此它包含分配的内存中的任何内容。碰巧你第一次调用你的函数时,它是 0,但后来它不是。
您从 malloc
取回的内存未初始化——因此可能包含任何内容。如果您希望它具有可预测的值,则需要显式设置结构的每个字段。
尝试将 malloc
调用更改为 calloc
,或者在 malloc
调用之后添加一个 memset(nodeLabHead, 0, sizeof(labVar))
。