Двойное освобождение или повреждение памяти - PullRequest
0 голосов
/ 17 февраля 2012

У меня есть такой код

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);
                    }   
                }   
            }   
        }   
    }   
}

Единственное место, где я использую verboseBuf, находится внутри последнего цикла if.но я получаю

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

Но как освободить его дважды, если я использую его только в одном месте?и каждый раз, когда я использую это, я освобождаю это.Я пытался использовать addr2line, чтобы найти место, где он был освобожден ранее, но все, что я получил, было ??:0.

Ответы [ 3 ]

7 голосов
/ 17 февраля 2012

Эта строка записывает один байт после конца вашего буфера.

verboseBuf[currSize + 1] = '\0';
3 голосов
/ 17 февраля 2012

Это сообщение не означает, что вы дважды что-то освободили, это означает, что glibc обнаружил повреждение кучи, и освобождение вещей дважды - это одна общая причина этого, но не единственная.

В этом случае строка

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

переполняет конец вашего буфера, повреждая все бухгалтерские данные, сохраненные распределителем после него.Уберите +1 и все должно заработать.

0 голосов
/ 17 февраля 2012

Сделать verboseBuf[currSize + 1] = '\0'; как verboseBuf[currSize] = '\0';

...