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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ncurses owerflows 
:(
    Опции темы
Loki
Дата 7.12.2014, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Всем привет,
возник вопрос по ncurses.
При открытии(F2), закрытии(F3) и вновь открытии окна(newwin)  растет RSS значении и оно не уменьшается, пока программа запущена.
Код

 root      6311  0.0  0.0  16372  1416 pts/0    S+   06:34   0:00 ./mwin
 root      6311  0.0  0.0  16372  1416 pts/0    S+   06:34   0:00 ./mwin
 root      6311  0.0  0.0  16644  1680 pts/0    S+   06:34   0:00 ./mwin
 root      6311  0.0  0.0  16644  1680 pts/0    S+   06:34   0:00 ./mwin
 root      6311  0.0  0.0  16780  1944 pts/0    S+   06:34   0:00 ./mwin
 root      6311  0.0  0.0  16780  1944 pts/0    S+   06:34   0:00 ./mwin
 root      6311  0.0  0.0  17048  2208 pts/0    S+   06:34   0:00 ./mwin

вот код тестовой програмки.
собирается вот так
gcc -o mwin -Wall -lncursesw mwin.c
Код

#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <sys/types.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <wchar.h>
#include <ncursesw/curses.h>
#include <curses.h>
#include <ncursesw/term.h>
#include <term.h>
#include <ncursesw/unctrl.h>
#include <unctrl.h>
#include <assert.h>
#include <ctype.h>
#include <locale.h>
#include <sys/types.h>
#include <sys/stat.h>

WINDOW **create_mwin(int k,int mwin){
int m,l;
        WINDOW **w;
        w = calloc(LINES-4,sizeof(WINDOW *));

        w[0]=newwin(LINES-2,COLS,1,0);
        wbkgd(w[0],COLOR_PAIR(1));
        box(w[0],ACS_VLINE,ACS_HLINE);

        for (m=1,l=mwin;m<LINES-4;m++){
                w[m] =subwin(w[0],1,COLS-2,m+1,1);
        }

        wbkgd(w[1],COLOR_PAIR(6));
        wrefresh(w[0]);
        return w;
}

void delete_mwin(WINDOW **w,int count){
        int i;
        for (i=0;i<count;i++){
                werase(w[i]);
                delwin(w[i]);
        }
        free(w);
}





int main(){
int key,quit=1,k=0,s=0;

WINDOW **mwin_w;
static WINDOW *master;

    setlocale(LC_ALL, "");

    initscr();
    cbreak();
    noecho();       
    intrflush(stdscr, 0);
    keypad(stdscr, 1);
 
    if (has_colors()) {
        start_color();
        init_pair(1, COLOR_WHITE, COLOR_BLACK);
        init_pair(6, COLOR_WHITE, COLOR_CYAN);
        bkgd(COLOR_PAIR(1));
    }


master = newwin(1, COLS, LINES-1, 0);


while(quit){

key = getch();
switch(key) {
 case 266: // F2
  mwin_w=create_mwin(k,s);
 break;
 case 267: // F3
 delete_mwin(mwin_w,LINES-4);
 erase();
 break;
 case 27: // ESCAPE
 quit=0;
 break;
 
}
refresh();
}

endwin();

exit(1);
}

вот вывод валгринда.
http://pastebin.ca/2883282

Это сообщение отредактировал(а) Loki - 7.12.2014, 11:36
PM MAIL   Вверх
tzirechnoy
Дата 7.12.2014, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

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



Проверяйте коды возврата.

Вообще, отвратительный код как пример для поиска бага. Коды возврата -- не проверяются, можно понажымать на кнопки (на которые надо нажать для появления бага) не в том пордяке -- и всё либо честно заполнится фигнёй либо вообще вылетит. Вместо определённых в документацыи констант (Я про KEY_F(2))-- какие-то жёстко вбитые значения. Деаллокацыя идёт от переменной, которая можэт меняться в процэссе -- и вообще зачем Вы вычисляете размер деаллоцырованного? Его следует записать, и удалять ровно столько, сколько создали.

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

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

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


 




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


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

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