Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с malloc && free 
:(
    Опции темы
niccom
Дата 20.4.2007, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.2.2007

Репутация: нет
Всего: нет



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

PM MAIL   Вверх
MAKCim
Дата 20.4.2007, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



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

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
niccom
Дата 21.4.2007, 06:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.2.2007

Репутация: нет
Всего: нет



Цитата(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-ов переписать - уверен будет работать.
PM MAIL   Вверх
MAKCim
Дата 21.4.2007, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



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

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Goganchic
Дата 23.4.2007, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 678
Регистрация: 18.6.2004

Репутация: нет
Всего: 5



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

если проще переписать без потоков - то лучше так и сделать, т.к. потоки существенно усложняют процесс написания программы а также дебаг.
PM Jabber   Вверх
niccom
Дата 23.4.2007, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.2.2007

Репутация: нет
Всего: нет



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

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

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

А насчет отладки на 100 % согласен с потоками на порядок сложнее.
PM MAIL   Вверх
MAKCim
Дата 23.4.2007, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



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

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

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0842 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.