Ошибка malloc.c при работе с strtok_r - PullRequest
0 голосов
/ 26 июня 2011

Я сделал UDP-сервер в C (Ubuntu 10.10).Сервер довольно большой, и часть его выполняет некоторую обработку строк с использованием Strtok_r () [я успешно использовал эту функцию ранее].Когда сервер запускается в первый раз, он правильно обрабатывает данные от клиента.Но когда приходит другой клиент и отправляет некоторые данные, программа вылетает со следующим сообщением:

MappingServer: malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Aborted 

Если я закомментирую функцию strtok_r (), тогда все будет работать правильно (независимо от того, сколько клиентов приходит!).Код, который вызывает проблему:

char delims[] = "/"; 
char* token = NULL; 
char* separated_token[4]; 
int i,j; 
char* last; 
j = 0; 
token = strtok_r( input_string, delims, &last );
       while( token != NULL)
       {
        separated_token[j] = malloc(strlen(token) + 1);
        strcpy(separated_token[j],token);
        printf("%s  ", separated_token[j] );

        j++;
        token = strtok_r( NULL, delims, &last );
        } 

Насколько я понимаю, код в порядке, и он отлично работает для первого клиента.Я немного запутался, что означает эта ошибка?Я попытался с strtok (), и результат тот же.

1 Ответ

1 голос
/ 26 июня 2011
 malloc.c:3096: sYSMALLOc: Assertion

Это означает, что внутренние структуры malloc в куче повреждены.Попробуйте запустить свой сервер на valgrind, чтобы найти ошибку использования кучи и / или повреждение памяти.

Код, который вы добавили, трудно проанализировать, потому что нет кода, который будет делать free();размер массива separated_token[] неизвестен.Вы освобождаете () все токены после обработки?Вы выделяете достаточно элементов для самого массива separated_token[]?Сбрасываете ли вы счетчик j в ноль перед началом токенизации второго запроса?

...