ошибка realloc: неверная контрольная сумма для освобожденного объекта - PullRequest
1 голос
/ 13 апреля 2011

Я пытаюсь написать код, который читает данные из stdin:

size_t bufSize = 1024;
unsigned char *msg = NULL;
size_t msgBytes = 0;
size_t inputMsgBufCount = 0;
unsigned char inputBuffer[bufSize];
size_t bytesRead = 0;
unsigned char *tmp = NULL;

if ((msg = (unsigned char *)malloc(sizeof(unsigned char) * bufSize)) == NULL)
    exit(EXIT_FAILURE);
bytesRead = fread(msg, sizeof(unsigned char) * bufSize, 1, stdin);
inputMsgBufCount++;

while (bytesRead) {
    printf("iteration: %lu\n", inputMsgBufCount);
    if ( (tmp = (unsigned char *)realloc(msg, (inputMsgBufCount * bufSize) + bufSize)) != NULL ) {
         printf("reallocated\n");
        msg = tmp;
        inputMsgBufCount++;
    }
    else {
        printf("Ran out of memory\n");
        free(msg);
    }
    bytesRead = fread(inputBuffer, sizeof(unsigned char) * bufSize, 1, stdin);
    memmove((msg + (inputMsgBufCount * bufSize)), inputBuffer, bufSize);
}

free(msg);

msgBytes = (inputMsgBufCount * bufSize);

gettimeofday(&end, NULL);
printf("%10.6lf [MB/s]\n", (msgBytes / (1<<20)) / ( (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec) * 1.0e-6f ));

Но после запуска это так: ~ # dd if = / dev / zero bs = 1024 count = 8 |./test У меня есть эта ошибка:

iteration: 1
reallocated
iteration: 2
reallocated
iteration: 3
reallocated
iteration: 4
reallocated
iteration: 5
reallocated
iteration: 6
reallocated
iteration: 7
test(11450) malloc: *** error for object 0x100804008: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
Abort trap

Может кто-нибудь помочь мне, пожалуйста.

1 Ответ

3 голосов
/ 13 апреля 2011

inputMsgBufCount предполагается увеличить после того, как вы скопируете данные в буфер сообщений. Вы делаете это прямо при первом чтении, но для всего остального вы увеличиваете его сразу после перераспределения. Если вы следите за значениями для него, это 1, когда вы входите в цикл. Вы перераспределяете на 2*bufSize и увеличиваете inputMsgBufCount, что составляет 2. Затем вы читаете данные и копируете их в msg+2*bufSize. Это портит ваш буфер. Вы должны были скопировать в msg+bufSize. Просто задерживайте приращение переменной до тех пор, пока вы не скопируете свои данные.

С другой стороны, вы можете безопасно использовать memcpy() для копирования данных. msg и inputBuffer никогда не будут перекрываться. На самом деле вам, вероятно, следует полностью избавиться от inputBuffer и прочитать прямо в msg с правильным смещением.

...