分配的内存在free()之后不释放

时间:2015-03-11 13:58:21

标签: c memory-management linked-list

努力学习malloc和free work,但我认为我可能做得对。我在我的测试文件的末尾调用了一个deleteList(),它应该释放所有的内存,但是当我使用valgrind时它表示我仍然分配了内存活动。如果有人知道如何解决这个问题,那就太好了。

测试源文件:

#include "stdlib.h"
#include "string.h"
#include "linked_list.h"

int main(int argc, char* argv[]){
  PersonalInfo *head = NULL;

  printList(head);

  insertToList(&head, 2, "Mike", "Pealow");
  printList(head);

  deleteList(&head);

  return 0;
}

原型文件:

#define NAME_LENGTH 32

typedef struct personalInfo {
  struct personalInfo *next;
  unsigned int id;    
  char firstName[NAME_LENGTH];
  char familyName[NAME_LENGTH];
} PersonalInfo;

PersonalInfo *insertToList(PersonalInfo **head, unsigned int id, char *firstName, char *familyName);
void printList(PersonalInfo *head);
void deleteList(PersonalInfo **head);

源文件:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "linked_list.h"

PersonalInfo *insertToList(PersonalInfo **head, unsigned int id, char *firstName, char *familyName){
  PersonalInfo *p = (PersonalInfo*)malloc(sizeof(PersonalInfo));
  strcpy(p->firstName, firstName);
  strcpy(p->familyName, familyName);
  p->id = id;
  p->next = NULL;
  if(*head!=NULL && p!=NULL){
    p->next = *head;
    return p;
  }
  else{
    printf("Head is null; create new head? (y/n)");
    char scChar;
    scanf("%c", &scChar);
    if(scChar=='y'){
      head = &p;
      return p;
    }
    else if(scChar=='n'){
      printf("Exiting");
      free(p);
      p=NULL;
      return NULL;
    }
    else{
      printf("Invalid input, exiting");
      free(p);
      p=NULL;
      return NULL;
    }
  }
}


void printNode(PersonalInfo *node){
  printf("%s %s %d", node->firstName, node->familyName, node->id);
}

void deleteList(PersonalInfo **head){
  if(*head==NULL)
    printf("List is empty\n");
  PersonalInfo *next, *currNode = *head;
  while(currNode!=NULL){
    next = currNode->next;
    free(currNode);
    currNode = next;
  }
  currNode = NULL;
}

3 个答案:

答案 0 :(得分:1)

我很惊讶你的节目终止了。

首先关闭:

void deleteList(PersonalInfo **head){
  if(&head==NULL)

应为:

if( *head==NULL )

因为指向指针的地址总是非NULL,所以你的测试总是失败。

下一步:

  printf("List is empty\n");
  PersonalInfo *next, *currNode = *head;
  while(&currNode!=NULL){

此处相同:&currNode 始终非NULL,因此此条件永远不应为false,即您的程序不应终止。 你需要测试一下:

 while( currNode!=NULL )

答案 1 :(得分:0)

我看到你的insertIntoList函数在列表的开头添加了一个新节点,但你永远不会改变对第一个音符(头指针)的引用。因此,当您释放列表时,您只释放最后一个节点。

在你的main()函数中尝试调用head = insertToList(&head, 2, "Mike", "Pealow");或者如果你在p->next = *head;之后坚持为insertIntoList的第一个参数添加一个双指针,则添加*head = p

答案 2 :(得分:0)

找出问题所在,我从头部分配内存而不删除它,所以当程序运行时,它仍然会计入内存分配。

在测试源文件中:

PersonalInfo *head = NULL;