C newNode内存泄漏/分段故障

C newNode内存泄漏/分段故障,c,struct,C,Struct,我不确定我在这方面做错了什么。我的程序看起来是正确的,但根据valgrind的说法,我的newNode函数显然存在内存泄漏。我想知道我在newNode函数中做错了什么,以及为什么做错了 代码是: #include<stdlib.h> #include<stdio.h> #include<string.h> #include "list.h" typedef struct lnode { char *term; int count; int l

我不确定我在这方面做错了什么。我的程序看起来是正确的,但根据valgrind的说法,我的newNode函数显然存在内存泄漏。我想知道我在newNode函数中做错了什么,以及为什么做错了

代码是:

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include "list.h"
typedef struct lnode {
   char *term;
   int count;
   int last;
   struct lnode *next;
}lnode,*lnodePtr;
/**
 * Returns a new linked list node filled in with the given word and line, and
 * sets the count to be 1. Make sure to duplicate the word, as the original word
 * may be modified by the calling function.
 */
 struct lnode *newNode (char* word, int line) {
    lnode *add=malloc(sizeof(lnode));
    add->term=(char *)malloc(strlen(word) + 1);
    strcpy((add -> term), word);
    add->count=1;
    add->last=line;
    add->next=NULL;
    return add;         
  }
  int main(int argc, char *argv[])
  {
    lnodePtr head=NULL; 
    char example[1000]="Name";
    char *ex=example;
    lnode *amc=newNode(ex,2);
    return(0);
  }
。。。我的newNode函数中存在内存泄漏

嗯,您分配了一些内存(使用
malloc
),但从未释放它(使用
free
)。这就是内存泄漏的定义

您的主管道应如下所示,以确保无泄漏:

int main(int argc, char *argv[])
{
  lnodePtr head=NULL; 
  char example[1000]="Name";
  char *ex=example;
  lnode *amc=newNode(ex,2);
  // actual work?
  freeNode(amc);
}

现在,您是否也需要编写
freeNode
的帮助?

如果添加free(amc->term),会发生什么情况;免费(amc);在main()中的return语句之前?你仍然收到警告吗?你的main没有调用deleteNode,你能显示一个版本吗?是的,因为我的deleteNode看起来也错了(很抱歉,我在链表方面缺乏经验,而且时间有限。非常感谢你的帮助)。我还想知道是main()错了,还是我的neewNode函数错了?我一直认为内存泄漏是没有主体指向的任何东西,不是程序退出时,未释放的内存会自动释放吗?为什么它会被计入内存泄漏?在操作系统的上下文中,它不是一个泄漏:系统将回收所有进程的内存,这是正确的。然而,valgrind正在研究如何在进程内管理内存,在进程中,即使操作系统在主出口后会将其清理干净,您仍泄漏了一个指针。
int main(int argc, char *argv[])
{
  lnodePtr head=NULL; 
  char example[1000]="Name";
  char *ex=example;
  lnode *amc=newNode(ex,2);
  // actual work?
  freeNode(amc);
}