• Domingo 15 de Diciembre de 2024, 21:40

Autor Tema:  Error Con Free()  (Leído 1014 veces)

Leber

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Error Con Free()
« en: Martes 25 de Marzo de 2008, 17:50 »
0
Buenas, estaba haciendo un programilla que buscara ficheros acabdos en ~, pero hay un problema. Primero les enganchare el codigo y luego lo comento:

Código: Text
  1. void buscar(char *home,const char *destino)
  2. {
  3.   DIR *dirp;
  4.   struct dirent *dir;
  5.   int fd,i,de,ds,nbytes;
  6.   char *duplicado;
  7.   char *pathdest;
  8.   char *pathhome;
  9.   char buffer[BUFSIZ];
  10.  
  11.                         if((dirp=opendir(home))==NULL)
  12.                           {
  13.                             perror(home);
  14.                             exit(-1);
  15.                           }
  16.  
  17.            
  18.        
  19.           if((pathdest=(char *)calloc(80,sizeof(char)))==NULL)
  20.                            {
  21.                               perror("malloc");
  22.                               exit(-1);
  23.                            }
  24.  
  25.                          if((pathhome=(char *)calloc(80,sizeof(char)))==NULL)
  26.                            {
  27.                               perror("malloc home");
  28.                               exit(-1);
  29.                            }
  30.                      printf("memoria reservada\n");
  31.      
  32.                     while((dir=readdir(dirp))!=NULL)
  33.                       {
  34.        
  35.                          
  36.                
  37.                printf("empezando while\n");
  38.        
  39.                          duplicado=strdup(dir->d_name);
  40.  
  41.                             for(i=strlen(dir->d_name)-1;i>0;i--)
  42.                                if(duplicado[i]=='~')
  43.                            {
  44.                                  
  45.                             pathhome=(char *)realloc(pathhome,((strlen(home))+((strlen(dir->d_name)))));
  46.                                   pathdest=(char *)realloc(pathdest,((strlen(destino))+((strlen(duplicado)))));
  47.              
  48.                                
  49.                                    sprintf(pathhome,"%s/%s",home,duplicado);
  50.                              sprintf(pathdest,"%s/%s",destino,duplicado);
  51.                                    
  52.                
  53.                                     if((fd=creat(pathdest,0666))==-1)
  54.                                 {
  55.                                 perror(pathdest);
  56.                           exit(-1);
  57.                          }
  58.            
  59.                        if((de=open(pathhome,O_RDONLY))==-1)
  60.                                      {
  61.                     perror(pathhome);
  62.                                       exit(-1);
  63.                          }
  64.                    
  65.                        if((ds=open(pathdest,O_WRONLY))==-1)
  66.                          {
  67.                                       perror(pathdest);
  68.                                       exit(-1);
  69.                                      }
  70.                      
  71.                      while((nbytes=read(de,buffer,sizeof(buffer)))>0)
  72.                        if((write(ds,buffer,nbytes))!=nbytes)
  73.                                    fprintf(stderr,"Error de escritura en %s\n",ds);
  74.          
  75.        
  76.                         close(de);
  77.                                     close(ds);
  78.  
  79.                        if((unlink(pathhome))==-1)
  80.                         {
  81.                                       perror(pathhome);
  82.                                       exit(-1);
  83.                                     }
  84.                         // printf("petando aqui\n");
  85.                                      
  86.            
  87.                         }
  88.                                //printf("hola\n");
  89.                                
  90.                    printf("repitiendo while\n");
  91.              }
  92.       printf("acabando\n");
  93.      
  94.  
  95.   closedir(dirp);
  96.   free(source);
  97.  printf("source liberado\n");
  98.   free(destdir);
  99.   printf("des liberado\n");
  100.   free(pathdest);
  101.   printf("pathdest liberado\n");
  102.   free(duplicado);
  103.   printf("duplicado liberado\n");
  104.   free(pathhome);
  105.   printf("pathhome liberado\n");
  106.   }
  107.  

El error esta en free(pathhome), ya que me peta ahi, cuando libero la memoria de pathhome. Como ven primero le asigno 80 bytes al empezar el programa, luego cada vez que se encuentra un fichero acabado en ~, le reasigno la lontigud del directorio mas la del nombre del fichero, y bueno, todo va bien hasta el momento de liberar la memoria que acaba con un:

Código: Text
  1. *** glibc detected *** ./backups: free(): invalid next size (fast): 0x0804c0c8 ***
  2. ======= Backtrace: =========
  3. /lib/i686/cmov/libc.so.6[0xb7e9b915]
  4. /lib/i686/cmov/libc.so.6(cfree+0x90)[0xb7e9f380]
  5. ./backups[0x8049092]
  6. ./backups[0x8048cb0]
  7. /lib/i686/cmov/libc.so.6(__libc_start_main+0xe0)[0xb7e46450]
  8. ./backups[0x80487f1]
  9. ======= Memory map: ========
  10. 08048000-0804a000 r-xp 00000000 08:06 639238 /home/null/mis_programas/backups
  11. 0804a000-0804b000 rw-p 00001000 08:06 639238 /home/null/mis_programas/backups
  12. 0804b000-0806c000 rw-p 0804b000 00:00 0 [heap]
  13. b7d00000-b7d21000 rw-p b7d00000 00:00 0
  14. b7d21000-b7e00000 ---p b7d21000 00:00 0
  15. b7e15000-b7e21000 r-xp 00000000 08:02 354860 /lib/libgcc_s.so.1
  16. b7e21000-b7e22000 rw-p 0000b000 08:02 354860 /lib/libgcc_s.so.1
  17. b7e2f000-b7e30000 rw-p b7e2f000 00:00 0
  18. b7e30000-b7f77000 r-xp 00000000 08:02 370991 /lib/i686/cmov/libc-2.7.so
  19. b7f77000-b7f78000 r--p 00147000 08:02 370991 /lib/i686/cmov/libc-2.7.so
  20. b7f78000-b7f7a000 rw-p 00148000 08:02 370991 /lib/i686/cmov/libc-2.7.so
  21. b7f7a000-b7f7d000 rw-p b7f7a000 00:00 0
  22. b7f89000-b7f8c000 rw-p b7f89000 00:00 0
  23. b7f8c000-b7fa8000 r-xp 00000000 08:02 354818 /lib/ld-2.7.so
  24. b7fa8000-b7faa000 rw-p 0001b000 08:02 354818 /lib/ld-2.7.so
  25. bfb95000-bfbaa000 rw-p bfb95000 00:00 0 [stack]
  26. ffffe000-fffff000 r-xp 00000000 00:00 0 [vdso]
  27. Abortado
  28.  

El error es : " free(): invalid next size (fast): 0x0804c0c8", y como ven todo va bien hasta que se intenta liberar su memoria:

acabando
source liberado
des liberado
pathdest liberado
duplicado liberado



Peta ahi. La verdad no se que estoy haciendo mal, si alguien pudiera ayudarme... se lo agradeceria mucho.

Gracias de antema

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Error Con Free()
« Respuesta #1 en: Miércoles 26 de Marzo de 2008, 16:17 »
0
Depuralo; especialmente comproba las direcciones que recibis de malloc y las que pasas a free.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.