• Domingo 22 de Diciembre de 2024, 12:32

Autor Tema:  error con un destructor  (Leído 1928 veces)

yellowpaper

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
error con un destructor
« en: Miércoles 26 de Diciembre de 2012, 13:37 »
0
Hola tengo un programa muy muy simple que  lee strings desde un archivo y los coloca en una nueva instancia (una por cada linea de archivo) de una clase que se llama Cadena.

En resumen seria

En el main

Código: [Seleccionar]

    FILE *archivo=fopen("archivo.txt","rt");
    char linea[5000];
    while(fgets(linea,5000,archivo))
        Cadena cadena(linea);

En la clase Cadena el constructor y el destructor serian

Código: [Seleccionar]
Cadena::Cadena(char *linea)
{
    cadena=new char[strlen(linea)];
    strcpy(cadena,linea);
}

Cadena::~Cadena()
{
        delete [] cadena;
}


Bien , ahora cuando lo pruebo el resultado es el siguiente...

Código: [Seleccionar]
novum homero cotidieque. Te utamur civibus eleifend qui, nam ei brute doming concludaturque, modo aliquam facilisi nec no. Vidisse maiestatis
constituam eu his, esse pertinacia intellegam ius cu. Eos ei odio veniam, eu sumo altera adipisci eam, mea audiam prodesset persequeris ea. Ad vitae dictas
vituperata sed, eum posse labore postulant id. Te eligendi principes dignissim sit, te vel dicant officiis repudiandae. Id vel sensibus honestatis omittantur, vel cu]
*** glibc detected *** ./Nuevo: double free or corruption (!prev): 0x000000000111c250 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7eb96)[0x7f56a63f9b96]
./Nuevo[0x401d71]
./Nuevo[0x401061]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7f56a639c76d]
./Nuevo[0x400f29]
======= Memory map: ========
00400000-00406000 r-xp 00000000 08:05 13762701                           /home/martin/Trabajo/mapa/Nuevo/bin/Debug/Nuevo
00605000-00606000 r--p 00005000 08:05 13762701                           /home/martin/Trabajo/mapa/Nuevo/bin/Debug/Nuevo
00606000-00607000 rw-p 00006000 08:05 13762701                           /home/martin/Trabajo/mapa/Nuevo/bin/Debug/Nuevo
0111c000-0113d000 rw-p 00000000 00:00 0                                  [heap]
7f56a607f000-7f56a617a000 r-xp 00000000 08:06 6299866                    /lib/x86_64-linux-gnu/libm-2.15.so
7f56a617a000-7f56a6379000 ---p 000fb000 08:06 6299866                    /lib/x86_64-linux-gnu/libm-2.15.so
7f56a6379000-7f56a637a000 r--p 000fa000 08:06 6299866                    /lib/x86_64-linux-gnu/libm-2.15.so
7f56a637a000-7f56a637b000 rw-p 000fb000 08:06 6299866                    /lib/x86_64-linux-gnu/libm-2.15.so
7f56a637b000-7f56a6530000 r-xp 00000000 08:06 6299858                    /lib/x86_64-linux-gnu/libc-2.15.so
7f56a6530000-7f56a672f000 ---p 001b5000 08:06 6299858                    /lib/x86_64-linux-gnu/libc-2.15.so
7f56a672f000-7f56a6733000 r--p 001b4000 08:06 6299858                    /lib/x86_64-linux-gnu/libc-2.15.so
7f56a6733000-7f56a6735000 rw-p 001b8000 08:06 6299858                    /lib/x86_64-linux-gnu/libc-2.15.so
7f56a6735000-7f56a673a000 rw-p 00000000 00:00 0
7f56a673a000-7f56a674f000 r-xp 00000000 08:06 6295141                    /lib/x86_64-linux-gnu/libgcc_s.so.1
7f56a674f000-7f56a694e000 ---p 00015000 08:06 6295141                    /lib/x86_64-linux-gnu/libgcc_s.so.1
7f56a694e000-7f56a694f000 r--p 00014000 08:06 6295141                    /lib/x86_64-linux-gnu/libgcc_s.so.1
7f56a694f000-7f56a6950000 rw-p 00015000 08:06 6295141                    /lib/x86_64-linux-gnu/libgcc_s.so.1
7f56a6950000-7f56a6a32000 r-xp 00000000 08:06 269768                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f56a6a32000-7f56a6c31000 ---p 000e2000 08:06 269768                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f56a6c31000-7f56a6c39000 r--p 000e1000 08:06 269768                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f56a6c39000-7f56a6c3b000 rw-p 000e9000 08:06 269768                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f56a6c3b000-7f56a6c50000 rw-p 00000000 00:00 0
7f56a6c50000-7f56a6c72000 r-xp 00000000 08:06 6299872                    /lib/x86_64-linux-gnu/ld-2.15.so
7f56a6e42000-7f56a6e47000 rw-p 00000000 00:00 0
7f56a6e6d000-7f56a6e72000 rw-p 00000000 00:00 0
7f56a6e72000-7f56a6e73000 r--p 00022000 08:06 6299872                    /lib/x86_64-linux-gnu/ld-2.15.so
7f56a6e73000-7f56a6e75000 rw-p 00023000 08:06 6299872                    /lib/x86_64-linux-gnu/ld-2.15.so
7fffa29c5000-7fffa29e6000 rw-p 00000000 00:00 0                          [stack]
7fffa29ff000-7fffa2a00000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Abortado (`core' generado)

Lee el archivo hasta un punto (depende el archivo que pona y otras cirscunstacias) y despues un error... :rain: y si lo pruebo con otro archivo tengo  otro error (no el mismo pero del mismo estilo del volcado de memoria)...
Si al destructor lo dejo limpio sin nada el programa funciona pero eso no esta bien...
Que esta pasando? Por que realmente no lo entiendo
« última modificación: Miércoles 26 de Diciembre de 2012, 16:09 por yellowpaper »

yellowpaper

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Re:error con un destructor
« Respuesta #1 en: Miércoles 26 de Diciembre de 2012, 22:07 »
0
El error ...

Código: [Seleccionar]
    cadena=new char[strlen(linea)];  A     cadena=new char[strlen(linea)+1];

Un error muy muy tonto , tan tonto que no lo pude descubrir ...gracias!.