invalid pointer free()

publicado por: Anonymous
ERROR: (gdb)
#0  0x00007ffff7a66067 in __GI_raise ([email protected]=6)
    at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
#1  0x00007ffff7a67448 in __GI_abort () at abort.c:89
#2  0x00007ffff7aa41b4 in __libc_message ([email protected]=1,
    [email protected]=0x7ffff7b99530 "*** Error in `%s': %s: 0x%s ***n")
    at ../sysdeps/posix/libc_fatal.c:175
#3  0x00007ffff7aa998e in malloc_printerr (action=1,
    str=0x7ffff7b95646 "free(): invalid pointer", ptr=<optimized out>)
    at malloc.c:4996
#4  0x00007ffff7aaa696 in _int_free (av=<optimized out>, p=<optimized out>,
    have_lock=0) at malloc.c:3840
#5  0x0000000000400bb9 in free_all_filenames_array (all_files=0x605010, len=1)
    at directorio.c:24
#6  0x00000000004028a0 in add_all_directory ()
#7  0x0000000000401967 in main (argc=1, argv=0x7fffffffe288) at programa.c:30

esta es mi función :

void free_all_filenames_array(char **all_files, int len){

  int i;


  for (i = 0; i<len; i++){

      if(all_files[i] != NULL){
       free(all_files[i]); // linea 24
       all_files[i] = NULL;
      }
    }

  if(all_files != NULL){
  free(all_files);
  all_files = NULL;
  }
}

int read_all_filenames_array(char *path, char ***all_files, int *error){

  void ** ptr;
  char **nombres = NULL;
  struct dirent *contenido;
  char realPath[PATH_MAX];
  static int num_nombres = 0;


  DIR *dir  = opendir(path);

  if(dir == NULL){
    printf(" ERROR");
    free(path);
    *error = errno;
    closedir(dir);
    return -1;
  }
//   
  realpath(path,realPath);

  while ((contenido = readdir(dir)) != NULL){

  if( contenido->d_type == DT_REG){// si es regular

    ptr = realloc(nombres, (num_nombres + 1) * sizeof(char *));

    if (ptr == NULL){
       printf("ERROR couldnt reallocate the memory");
      *error = errno;
      free_all_filenames_array(nombres,num_nombres);
      closedir(dir);
      return -1;
    }

    nombres = (char **)ptr;

    strcat(realPath,contenido->d_name);
    nombres[num_nombres] = strdup(realPath);

    if(nombres[num_nombres] == NULL){
       free_all_filenames_array(nombres,num_nombres + 1);
       *error = errno;
       closedir(dir);
       return -1;
    }

    num_nombres++;
  }
 }


if (nombres != NULL){
      *all_files = nombres;
     free_all_filenames_array(nombres,num_nombres); // AQUI ME SUELE DAR EL ERROR
     nombres = NULL;
  }
  else printf("Sin ficheros regulares");

  *error = errno;
  closedir(dir);
  return num_nombres;

 }

solución

Llevo un rato mirando, pero creo que lo he encontrado:

num_nombres++;
} }

if (nombres != NULL){ *all_files = nombres; free_all_filenames_array(nombres,num_nombres); // AQUI ME SUELE DAR EL ERROR nombres = NULL; }else printf("Sin ficheros regulares");

Primero incrementas ‘num_nombres’, y luego llamas a ‘free_all_filenames_array’ con ese ‘num_nombres’ incrementado. No tengo un compilador a mano, pero intenta algo como

free_all_filenames_array( nombre, num_nombres - 1 );

Si estoy en lo cierto, estas intentando liberar memoria que tu no has asignado.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *