Mam taki kod

char *verboseBuf = NULL;
if(somethin){
    for(a loop){
        for(another loop){
            if(somethin else){
                if(curl execution){
                    if(fail){
                        verboseBuf = (char *) malloc(sizeof(char) * (currSize +1));
                        fread(verboseBuf, 1, currSize, verboseFd);
                        verboseBuf[currSize + 1] = '\0';
                        string verbose = verboseBuf;
                        free(verboseBuf);
                    }   
                }   
            }   
        }   
    }   
}

Jedynym miejscem, w którym używam verboseBuf, jest końcowa pętla if. ale rozumiem

*** glibc detected *** ./test: double free or corruption (!prev): 0x13c13290 ***

Ale jak mogę go dwukrotnie uwolnić, jeśli używam go tylko w jednym miejscu? i za każdym razem, gdy go używam, uwalniam go. Próbowałem użyć addr2line, aby znaleźć miejsce, w którym został wcześniej zwolniony, ale wszystko, co dostałem, to ??:0.

0
Prasanth Madhavan 17 luty 2012, 11:35

3 odpowiedzi

Najlepsza odpowiedź

Ta linia zapisuje jeden bajt za końcem twojego bufora.

verboseBuf[currSize + 1] = '\0';
7
StilesCrisis 17 luty 2012, 11:36

Ta wiadomość nie oznacza konkretnie, że zwolniłeś coś dwukrotnie, oznacza to, że glibc wykrył uszkodzenie sterty, a dwukrotne zwolnienie rzeczy jest jedną częstą przyczyną tego, ale nie jedyną.

W tym przypadku linia

verboseBuf[currSize + 1] = '\0';

Przepełnia koniec bufora, uszkadzając wszelkie dane księgowe przechowywane po nim przez alokator. Usuń +1 i powinno działać.

3
Wyzard 17 luty 2012, 11:39

Zrób verboseBuf[currSize + 1] = '\0'; jako verboseBuf[currSize] = '\0';

0
omggs 17 luty 2012, 11:45