Valgrind-malloc泄漏

Valgrind-malloc泄漏,c,malloc,memory-leaks,valgrind,C,Malloc,Memory Leaks,Valgrind,我正在编写一个程序,在目录中搜索请求的文件。命令行上的输出将是文件的目录路径,对于找到的每个同名文件。由于某种原因,当我使用valgrind运行它时,它会导致内存泄漏。 我在windows机箱上的linux虚拟机上运行 我更新了我的valgrind输出。我没有漏洞,但仍然有错误 这是我的密码: #include <stdio.h> #include <stdlib.h> #include <dirent.h> #include <sys/types.h&

我正在编写一个程序,在目录中搜索请求的文件。命令行上的输出将是文件的目录路径,对于找到的每个同名文件。由于某种原因,当我使用valgrind运行它时,它会导致内存泄漏。 我在windows机箱上的linux虚拟机上运行

我更新了我的valgrind输出。我没有漏洞,但仍然有错误

这是我的密码:

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/types.h>
#include <string.h>

struct tree_t {

  char *name;
  int  nchildren;
  struct tree_t **children;
};

char *make_path(const char *dirname, const char *filename) {
  char *fullpath = (char *) malloc((strlen(dirname) + strlen(filename) + 1 + 1) * sizeof(char));
  strcat(fullpath, dirname);
  strcat(fullpath, "/");
  strcat(fullpath, filename);
  return fullpath;
}

struct tree_t *get_tree(const char *name) {
  struct tree_t *tree = (struct tree_t *) malloc(sizeof(struct tree_t)); 
  char *namecp = (char *) malloc((strlen(name) + 1) * sizeof(char));
  strcpy(namecp, name);
  tree->name = namecp;

  DIR *dir = opendir(name);
  if (dir == NULL) {
    tree->nchildren = 0;
  } else {
    tree->nchildren = 0;
    int numsubdirs = 0;

    struct dirent *entry;

    while((entry = readdir(dir))) {
      if (strcmp(entry->d_name,".") != 0 && strcmp(entry->d_name,"..") != 0) {
        tree->nchildren++;  
        DIR *subdir = opendir(entry->d_name);
        if (subdir != NULL) {
          numsubdirs++;
        }
        closedir(subdir);
      }
    }

    tree->children = (struct tree_t **) malloc(numsubdirs * sizeof(struct tree_t **));
  }
  closedir(dir);
  return tree;
}

void find_in_tree(const struct tree_t *root, const char *filename) {
  int i = 0;

  DIR *dir = opendir(root->name);

  if (dir != NULL) {

    struct dirent *entry;

    while((entry = readdir(dir))) {
      if (strcmp(entry->d_name,".") != 0 && strcmp(entry->d_name,"..") != 0) {
        char *fullpath = make_path(root->name, entry->d_name);
        DIR *subdir = opendir(fullpath);
        if (subdir != NULL) {
          root->children[i] = get_tree(fullpath);
          find_in_tree(root->children[i], filename);
          free(root->children[i]);
          i++;
        } else if (strcmp(entry->d_name, filename) == 0) {
          printf("%s\n", fullpath);
        } 
        free(fullpath);
      }
    }
  }

  free(root->name);
  free(root->children);

}

int main(int argc, char **args) {
  printf("What root directory do you want to start from?\n");
  char rootdir[256];
  scanf("%s",rootdir);

  char searchfile[256];
  printf("What file do you want to search for?\n");
  int result = scanf("%s",searchfile);

  if (result == EOF) {
    printf("\n");
    exit(1);
  }

  struct tree_t *root = get_tree(rootdir);
  find_in_tree(root, searchfile);
  free(root);

  return 0;
}

什么都行,谢谢

信任
valgrind
而不是你的代码

例如:

char *make_path(const char *dirname, const char *filename) {
    char *fullpath = (char *) malloc((strlen(dirname) + strlen(filename) + 1 + 1) * sizeof(char));
    strcat(fullpath, dirname);
malloc()
返回的内存未初始化。您还不能使用strcat()


毫无疑问,还会有类似的问题。

对于您所做的每一个opendir,您都应该以请检查结束。这可能是你的泄漏源

Valgrind也向你们指出了这一点

==468== 65,648 bytes in 2 blocks are definitely lost in loss record 3 of 3 
==468==    at 0x4A0610C: malloc (vg_replace_malloc.c:195) 
==468==    by 0x3CA3296822: __alloc_dir (in /lib64/libc-2.5.so) 
==468==    by 0x400A09: find_in_tree (in /USERS/STUDENTS/S-Z/V/VOSTERJL/dirch) 
==468==    by 0x400B0F: find_in_tree (in /USERS/STUDENTS/S-Z/V/VOSTERJL/dirch) 
==468==    by 0x400C06: main (in /USERS/STUDENTS/S-Z/V/VOSTERJL/dirch) 

什么站台?这可能很重要,在Mac电脑上,它总是报告至少一些泄漏。如果您使用
--泄漏检查完整
--跟踪源代码是
重新运行valgrind,那么您将看到泄漏的内存和未初始化的值来自何处。
完整路径
malloc
ed,这不能保证
0
初始化,因此警告与未初始化值相关。可能
strcat(完整路径,目录名)应该是strcpy(完整路径,目录名)?。还要确保字符串已
NUL
终止。不要在中键入
malloc的返回值C@Prashant-他对问题中的平台进行了sez,windows上的linix vm。是的,我忘记了*fullpath='\0';以消除valgrind结果中的警告。
==468== 65,648 bytes in 2 blocks are definitely lost in loss record 3 of 3 
==468==    at 0x4A0610C: malloc (vg_replace_malloc.c:195) 
==468==    by 0x3CA3296822: __alloc_dir (in /lib64/libc-2.5.so) 
==468==    by 0x400A09: find_in_tree (in /USERS/STUDENTS/S-Z/V/VOSTERJL/dirch) 
==468==    by 0x400B0F: find_in_tree (in /USERS/STUDENTS/S-Z/V/VOSTERJL/dirch) 
==468==    by 0x400C06: main (in /USERS/STUDENTS/S-Z/V/VOSTERJL/dirch)