Re[2]: invalid fastbin entry (free):
От: Ovoshlook  
Дата: 17.04.14 18:16
Оценка:
Здравствуйте, watchmaker, Вы писали:

O>Хотел думать что проблема с выделением нового блока памяти, но в таких случаях обычно выдается segfault. В чем именно проблема может быть еще -я пока что понять не могу.

Проблема в том, что ты записываешь свои данные в область памяти, которую ты не выделял. Ну а вскрывается это не сразу, а собственно при других операциях с памятью, вроде того же вызова realloc.

Ну как же не выделял если я ее тем же самым realloc выделяю для записи этой строки? Если не сложно- можно более подробно? пока что не понятно где я с выделением памяти просчитался?

Вот здесь:
else

                {
                        if (i==2)

                                map.value=(char **)malloc(sizeof(char *)*j+1);

                        else

                                map.value=(char **)realloc(map.value,sizeof(char*)*j+1);

Если я встречаю первое значение для value я выделяю память через valloc для элемента массива, если же у меня знчение отличное от первого, значит я могу утверждать что память уже выделена и остается только ее расширить на необходимое количество байт.

Не понимаю пока что что не так в этом куске?

W>Попробуй для начала его разбить на функции, убрать копипасту, дать переменным нормальные имена, а не безликие i/j/k.

Ок. Принято

W>Вот, например, если смотреть на имена, то почему у тебя j хранит длину строки в одном месте: int j=strlen(arr->substrings[i-1]);, а в другим месте — используется для определения длины массива указателей, которые ссылаются на эти строки: map.name=(char **)malloc(sizeof(char *)*j+1); ?


Потому что выделяемая область памяти зависит от размера строки, который в свою очередь хранит переменная j

O>>На всякий случай положил исходники самих обработчиков MAPPER и SPLITTER в отдельный файл и запихнул так же исходник с тестовым примером где проявляется ошибка

W>Молодец. Пусть там и лежат. Больше их не трогай, а возьми GLib

GLib не тяжеловата для таких, в общем то не сильно затратных операций? Может есть аналоги поменьше?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.