Функция del_panel библиотеки ncurses вызывает segfault

У меня есть код, который размещает панели в одной функции с new_panel и пытается освободить их с del_panel в другой функции. Пример кода ниже

void medical_cards(int regid){ //work with patient's medical cards
/*...*/
PANEL *pmedcards[cards];
WINDOW *wmedcards[cards];

bind_windows(pmedcards, wmedcards, cards); 
//this function allocates panels
/*...*/
update_panels();
doupdate();

/*...*/

i = 0;
while (i < cards)
   del_panel(pmedcards[i++]); 
  /*here I get segfault with backtrace pointing 
  to wtouchln function of the ncurses library*/
i = 0;
while (i < cards)
    delwin(wmedcards[i++]);
return;
}

void bind_windows(PANEL **pmedcards, WINDOW **wmedcards, int cards){ 
int height = 15, width = 40, ypos = LINES - 20, xpos = COLS - 45;

int i = 0;
while (i < cards) {
    wmedcards[i] = newwin(height, width, ypos, xpos + i);
    box(wmedcards[i++], 0, 0);
}
i = 0;
while (i < cards) 
    pmedcards[i] = new_panel(wmedcards[i++]);
}

Проблема в том, что я получаю segfault при попытке освободить панели, отладчик указывает на функцию wtouchln как источник проблем. Кажется, что раньше никто не сталкивался с такой проблемой, и на страницах руководства почти нет описания функции del_panel, любая помощь приветствуется. Я ожидаю, что del_panel выполнит свою работу, освободив ресурсы и вернувшись нормально, не вызывая сбой программы.

2 ответа

Решение
pmedcards[i] = new_panel(wmedcards[i++]);

Какой первый я или я ++? Это UB.

Проблема не была связана с библиотекой ncurses, скорее глупая ошибка при выделении новой панели, которая вызвала неопределенное поведение, как указал Михал Марсалек. Задача решена

Другие вопросы по тегам