Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Проблемы с malloc && free


Автор: niccom 20.4.2007, 14:36
Cуть проблемы вот в чем 
В main создаю три потока 
в одном из них вызываю функцию(ниже по тексту)
Эта  функция получает указатель на структуру
которая содежит указатель на место в памяти и длину
Мне нужно сформировать экран из 40 строк и вывести в stdout.
Столкнулся с проблемой 
создаю строку- буфер маллоком в цикле
в конце каждой итерации делаю free()
и на этом прогу выбрасывает с сообщением:
SIGABRT
0xffffe410 in __kernel_vsyscall()

Дальше комментирую free()
все работает пока памяти хватает ,ессно.
Если эту ф-ию реализовать как отдельную прогу все то же
работает.
Грешу на pthread
Может кто сталкивался?




Код

int refreshScr(FILE_STRING* filestr)
{
int i;
char* test,* ptrs;
char zero[]={'\n','\0'};

for(i=0;i<=40;i++)
{
    test=(char*)malloc(((filestr+i)->dlina+3)*sizeof(char));
    if (test == NULL) addstr("Malloc fails");
    ptrs=strncpy(test,(filestr+i)->_string,(filestr+i)->dlina);
    strcat(ptrs,zero);
    addstr(ptrs);
    //free(test);
    //free(NULL);
}
refresh(); 

return 1;  
}

Автор: MAKCim 20.4.2007, 18:50
Цитата(niccom @  20.4.2007,  14:36 Найти цитируемый пост)
Грешу на pthread

как показывает практика грешить на библиотеку надо в самую последнюю очередь  smile 
во-первых, что есть addstr()?
во-вторых (все зависит от того, что есть addstr()) ptrs после первой итерации не валиден поскольку мы вызываем free(test), а ptrs = test

Автор: niccom 21.4.2007, 06:28
Цитата(MAKCim @ 20.4.2007,  18:50)
Цитата(niccom @  20.4.2007,  14:36 Найти цитируемый пост)
Грешу на pthread

как показывает практика грешить на библиотеку надо в самую последнюю очередь  smile 
во-первых, что есть addstr()?
во-вторых (все зависит от того, что есть addstr()) ptrs после первой итерации не валиден поскольку мы вызываем free(test), а ptrs = test

addstr() ф-ия из ncurses принимает указатель
на строку
Конечно же я перепробовал варианты 
с установкой ptrs=NULL;
             free(test);
             test=NULL;
             следующая итерация

Результат тот же.
Теперь по кол-ву памяти которым владеет вся прога
не считая статически выделенной при компиляции - копейки
динамически выделено до вызова этой ф-ии
около 4 килобайт.

В конце своих опытов я сделал
такой трюк - уменьшил кол -во итераций до 2-х
а free(test); 
вызвал не из цикла а перед выходом
из ф-ии результат тот же.
Где дальше рыть не знаю
Проще без thread-ов переписать - уверен будет работать.

Автор: MAKCim 21.4.2007, 09:22
все зависит от того, используется ли ptrs после вызова addstr() (в смысле используется ли библиотекой), если используется, то ошибка закономерна
Цитата(niccom @  21.4.2007,  06:28 Найти цитируемый пост)
с установкой ptrs=NULL;
             free(test);
             test=NULL;
             следующая итерация

это ничего не даст
совет, пробегись отладчиком по коду и точно локализуй ошибку

Автор: Goganchic 23.4.2007, 10:23
Цитата(niccom @  21.4.2007,  06:28 Найти цитируемый пост)
Проще без thread-ов переписать - уверен будет работать. 

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

Автор: niccom 23.4.2007, 15:20
Цитата(Goganchic @ 23.4.2007,  10:23)
Цитата(niccom @  21.4.2007,  06:28 Найти цитируемый пост)
Проще без thread-ов переписать - уверен будет работать. 

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

Ну насчет усложняют написания программы я бы поспорил.
Другое дело что программирование с потоками нужно организовывать очень
тщательно . Видимо какой то момент я упустил. Мне кажется нужно
попробовать выделять память на границе страницы.
В любом случае у меня появился спортивный интерес добить эту прогу.
Иначе применение thread- ов и не освоить если на первом трабле все бросить. 

А насчет отладки на 100 % согласен с потоками на порядок сложнее.

Автор: MAKCim 23.4.2007, 18:54
Цитата(Goganchic @  23.4.2007,  10:23 Найти цитируемый пост)
если проще переписать без потоков - то лучше так и сделать, т.к. потоки существенно усложняют процесс написания программы а также дебаг.

ничего подобного (во всяком случае я бы так категорично не заявлял)
что проще по-твоему написать: сервер многопоточный (многопроцессный) или с использованием конечного автомата?

Добавлено через 44 секунды
niccom, 
здается мне, что многопоточность тут не причем

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)