free(): invalid next size



  • Hallo!
    Das Programm compiliert, funktioniert aber nicht wie erwartet.

    int node_add(t_unv_node node)
    /* ************************************************** ***************** */
    /* Routine fuegt neuen Knoten an Knotenliste an ---------------------- */
    /* node : neuer Knoten -------------------------------------------- */
    {
    /* Allozieren des Speichers fuer ein neues Listenelement ------------- */
    printf("\n basis_data_func.c : node_add1, new_anz_node =%d",new_anz_node);//Hinzugefuegt von A.L.
    
    if ((new_unv_node = (t_unv_node*)
    realloc(new_unv_node,
    sizeof(t_unv_node) * (new_anz_node + 1)))
    ==NULL)
    return(-1); /* Fehler: nicht genuegend Speicher -------------- */
    
    memcpy((char *)(&new_unv_node[new_anz_node]), (char *)&node,
    sizeof(t_unv_node));
    
    new_anz_node += 1;
    
    return(0);
    /* ************************************************** ***************** */
    }
    

    Die obere Methode wird einmal durchgelaufen, beim zweiten mal aber kommt das Untere heraus.

    basis_data_func.c : node_add1, new_anz_node =0
    *** glibc detected *** ./shellcast_gcc: free(): invalid next size (normal): 0x080988b0 ***
    ======= Backtrace: =========
    /lib/libc.so.6[0xb7db26e1]
    /lib/libc.so.6[0xb7db53b2]
    /lib/libc.so.6(realloc+0xff)[0xb7db656f]
    ./shellcast_gcc[0x806bc8e]
    ./shellcast_gcc[0x8058abf]
    ./shellcast_gcc[0x805c91d]
    ./shellcast_gcc[0x8065191]
    ./shellcast_gcc[0x80509a7]
    ./shellcast_gcc(__gxx_personality_v0+0x2c3)[0x80494ff]
    /lib/libc.so.6(__libc_start_main+0xdc)[0xb7d63f9c]
    ./shellcast_gcc(__gxx_personality_v0+0x75)[0x80492b1]
    ======= Memory map: ========
    08048000-08076000 r-xp 00000000 03:08 949392 /home/alex/Desktop/ASG_1/bin/shellcast_gcc
    08076000-08077000 r--p 0002d000 03:08 949392 /home/alex/Desktop/ASG_1/bin/shellcast_gcc
    08077000-08078000 rw-p 0002e000 03:08 949392 /home/alex/Desktop/ASG_1/bin/shellcast_gcc
    08078000-080cc000 rw-p 08078000 00:00 0 [heap]
    b7900000-b7921000 rw-p b7900000 00:00 0
    b7921000-b7a00000 ---p b7921000 00:00 0
    b7a3f000-b7d4e000 rw-p b7a3f000 00:00 0
    b7d4e000-b7e76000 r-xp 00000000 03:08 2698099 /lib/libc-2.5.so
    b7e76000-b7e77000 r--p 00128000 03:08 2698099 /lib/libc-2.5.so
    b7e77000-b7e79000 rw-p 00129000 03:08 2698099 /lib/libc-2.5.so
    b7e79000-b7e7c000 rw-p b7e79000 00:00 0
    b7e7c000-b7e86000 r-xp 00000000 03:08 2698143 /lib/libgcc_s.so.1
    b7e86000-b7e88000 rw-p 00009000 03:08 2698143 /lib/libgcc_s.so.1
    b7e88000-b7eac000 r-xp 00000000 03:08 2698107 /lib/libm-2.5.so
    b7eac000-b7eae000 rw-p 00023000 03:08 2698107 /lib/libm-2.5.so
    b7eae000-b7f87000 r-xp 00000000 03:08 2032012 /usr/lib/libstdc++.so.6.0.8
    b7f87000-b7f8a000 r--p 000d9000 03:08 2032012 /usr/lib/libstdc++.so.6.0.8
    b7f8a000-b7f8c000 rw-p 000dc000 03:08 2032012 /usr/lib/libstdc++.so.6.0.8
    b7f8c000-b7f93000 rw-p b7f8c000 00:00 0
    b7fba000-b7fbd000 rw-p b7fba000 00:00 0
    b7fbd000-b7fbe000 r-xp b7fbd000 00:00 0 [vdso]
    b7fbe000-b7fd9000 r-xp 00000000 03:08 2698092 /lib/ld-2.5.so
    b7fd9000-b7fdb000 rw-p 0001a000 03:08 2698092 /lib/ld-2.5.so
    bf837000-bf89e000 rw-p bf837000 00:00 0 [stack]
    basis_data_func.c : node_add1, new_anz_node =1Abgebrochen

    Woran liegt das? Bitte um Hilfe!



  • Du hast dir irgendwo zwischen den beiden Aufrufen den Heap zerstört (vermutlich ein falscher Index-Zugriff). Btw, wo sind eigentlich new_unv_node und new_anz_node her?

    PS: den Rückgabewert von realloc() casten nur C++ Programmierer - und die würden eher einen std::vector<> verwenden anstelle der manuellen Speicherkontrolle.



  • CStoll schrieb:

    PS: den Rückgabewert von realloc() casten nur C++ Programmierer -

    nicht nur das, Memory Leaks sind dabei möglich, weil wenn realloc NULL zurückliefert, dann verliert man einen Pointer (oder mehr sogar, falls dies eine Liste ist).

    /* wie rufe ich realloc auf? */
    datatype *ptr = malloc(...);
    ...
    datatype *tmp;
    tmp = realloc(ptr, new_size);
    if(tmp == NULL)
    {
      /* ptr bleibt intakt und geht nicht verloren */
      ...
    }
    
    ptr = tmp;
    

    Keine Ahnung, wie t_unv_node definiert ist, aber wenn du über die Funktion den Inhalt des Pointers ändern willst, dann muss man einen Pointer auf den Pointer übergeben, ergo

    int node_add(t_unv_node *node)
        t_unv_node tmp;
        printf("\n basis_data_func.c : node_add1, new_anz_node =%d",new_anz_node);
    
        tmp = realloc(*node, sizeof(t_unv_node) * (new_anz_node + 1));
        if(tmp == NULL) /* Fehler, node bleibt aber intakt */
            return -1;
    
        *node = tmp;
    
        /* dein memcpy verstehe ich nicht, ich seh dort das eigentliche Problem */
        new_anz_node += 1;
    
        return 0;
    }
    

    CStolls Fragen "Btw, wo sind eigentlich new_unv_node und new_anz_node her?" würde ich an dieser Stelle auch stellen.


Anmelden zum Antworten