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
.
3 odpowiedzi
Ta linia zapisuje jeden bajt za końcem twojego bufora.
verboseBuf[currSize + 1] = '\0';
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ć.
Zrób verboseBuf[currSize + 1] = '\0';
jako verboseBuf[currSize] = '\0';
Podobne pytania
Nowe pytania
c++
C ++ to język programowania ogólnego przeznaczenia. Pierwotnie został zaprojektowany jako rozszerzenie C i ma podobną składnię, ale teraz jest to zupełnie inny język. Użyj tego tagu w przypadku pytań dotyczących kodu (który ma zostać) skompilowany za pomocą kompilatora C ++. Użyj znacznika specyficznego dla wersji w przypadku pytań związanych z określoną wersją standardu [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] lub [C ++ 23] itp. .