Valgrind показывает утечки памяти из команд ncurses после использования соответствующих free () и end ()

У меня есть программа, которую я пишу, чтобы лучше понять ncurses, и когда я проталкиваю ее через valgrind, он выводит много утечек, связанных с командами ncurses.
Тем не менее, я использую только stdscrи позвоните endwin() в конце main(), У меня есть пользовательские настройки, заданные с помощью menu.h, и в конце я использую free_item и free_menu:

menuChoice(WINDOW* scr, std::vector<std::string> *choices,
std::string desc)
{
//create the menu and the item pointer vector
MENU* my_menu;
std::vector<ITEM*> my_items;
ITEM* cur = NULL;
for (int x = 0; x < choices->size(); x++)
{
//populate the items vector with the string data in choices
my_items.push_back(new_item(choices->at(x).c_str(), NULL));
}
//pushback a null item
my_items.push_back((ITEM*)NULL);
//create the menu and attach the items
my_menu = new_menu((ITEM**)my_items.data());
//print the desc and post the menu
mvwprintw(scr, LINES - 3, 0, "%s\n", desc.c_str());
post_menu(my_menu);
wrefresh(scr);
int c = 0;
while((c = wgetch(scr)) != '\n')
{   switch(c)
{   case KEY_DOWN:
menu_driver(my_menu, REQ_DOWN_ITEM);
break;
case KEY_UP:
menu_driver(my_menu, REQ_UP_ITEM);
break;
}
}
cur = current_item(my_menu);
int toReturn;
toReturn = boost::lexical_cast<int>((char*) item_name(cur));
unpost_menu(my_menu);
for (int x = 0; x < my_items.size(); x++)
{
free_item(my_items[x]);
}
free_menu(my_menu);
return toReturn;
}

Тем не мение, valgrind до сих пор дает мне много этого:

==25266==    at 0x402A17C: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==25266==    by 0x405F2F3: _nc_hash_map (in /lib/i386-linux-gnu/libncurses.so.5.9)
==25266==    by 0x405E606: _nc_scroll_optimize (in /lib/i386-linux-gnu/libncurses.so.5.9)
==25266==    by 0x4075FF1: doupdate (in /lib/i386-linux-gnu/libncurses.so.5.9)
==25266==    by 0x406B02E: wrefresh (in /lib/i386-linux-gnu/libncurses.so.5.9)
==25266==    by 0x4064AAF: ??? (in /lib/i386-linux-gnu/libncurses.so.5.9)
==25266==    by 0x4064C46: _nc_wgetch (in /lib/i386-linux-gnu/libncurses.so.5.9)
==25266==    by 0x40658B9: wgetch (in /lib/i386-linux-gnu/libncurses.so.5.9)
==25266==    by 0x804B309: blackjack::menuChoice(_win_st*, std::vector<std::string, std::allocator<std::string> >*, std::string) (blackjack.cpp:555)
==25266==    by 0x804AF66: blackjack::prefScreen(_win_st*) (blackjack.cpp:521)
==25266==    by 0x8049BFF: blackjack::blackjack(_win_st*) (blackjack.cpp:21)
==25266==    by 0x8050118: blackjack_routine(_win_st*) (main.cpp:50)
==25266==
==25266== 1,900 bytes in 1 blocks are still reachable in loss record 44 of 49
==25266==    at 0x402C324: realloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==25266==    by 0x4088068: _nc_doalloc (in /lib/i386-linux-gnu/libtinfo.so.5.9)
==25266==    by 0x4090076: _nc_read_termtype (in /lib/i386-linux-gnu/libtinfo.so.5.9)
==25266==    by 0x40903EB: _nc_read_file_entry (in /lib/i386-linux-gnu/libtinfo.so.5.9)
==25266==    by 0x4090578: _nc_read_entry (in /lib/i386-linux-gnu/libtinfo.so.5.9)
==25266==    by 0x408A5E4: _nc_setup_tinfo (in /lib/i386-linux-gnu/libtinfo.so.5.9)
==25266==    by 0x408A95B: _nc_setupterm (in /lib/i386-linux-gnu/libtinfo.so.5.9)
==25266==    by 0x4069580: newterm (in /lib/i386-linux-gnu/libncurses.so.5.9)
==25266==    by 0x4066013: initscr (in /lib/i386-linux-gnu/libncurses.so.5.9)
==25266==    by 0x80500C2: main (main.cpp:36)
==25266==
==25266== 2,836 bytes in 1 blocks are still reachable in loss record 45 of 49
==25266==    at 0x402A17C: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==25266==    by 0x408807F: _nc_doalloc (in /lib/i386-linux-gnu/libtinfo.so.5.9)
==25266==    by 0x406F026: _nc_printf_string (in /lib/i386-linux-gnu/libncurses.so.5.9)
==25266==    by 0x406AB22: vwprintw (in /lib/i386-linux-gnu/libncurses.so.5.9)
==25266==    by 0x406AC68: mvwprintw (in /lib/i386-linux-gnu/libncurses.so.5.9)
==25266==    by 0x804B2A3: blackjack::menuChoice(_win_st*, std::vector<std::string, std::allocator<std::string> >*, std::string) (blackjack.cpp:550)
==25266==    by 0x804AF66: blackjack::prefScreen(_win_st*) (blackjack.cpp:521)
==25266==    by 0x8049BFF: blackjack::blackjack(_win_st*) (blackjack.cpp:21)
==25266==    by 0x8050118: blackjack_routine(_win_st*) (main.cpp:50)
==25266==    by 0x80500F3: main (main.cpp:41)
==25266==
==25266== 3,182 bytes in 1 blocks are still reachable in loss record 46 of 49
==25266==    at 0x402A17C: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==25266==    by 0x406C0CF: _nc_setupscreen (in /lib/i386-linux-gnu/libncurses.so.5.9)
==25266==    by 0x40695CE: newterm (in /lib/i386-linux-gnu/libncurses.so.5.9)
==25266==    by 0x4066013: initscr (in /lib/i386-linux-gnu/libncurses.so.5.9)
==25266==    by 0x80500C2: main (main.cpp:36)

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

0

Решение

Это обсуждается в FAQ по ncurses Тестирование на утечки памяти:

Возможно, вы использовали инструмент, такой как dmalloc или valgrind, для проверки утечек памяти. Обычно он сообщает о большом количестве памяти, которая все еще используется. Это нормально.

В скрипте настройки ncurses есть опция —disable-leaks, которую вы можете использовать для продолжения анализа. Он говорит ncurses, чтобы освободить память, если это возможно. Однако большая часть используемой памяти является «постоянной».

Любая реализация curses не должна освобождать память, связанную с экраном, поскольку (даже после вызова endwin ()) она должна быть доступна для использования при следующем вызове refresh (). Есть также куски памяти, которые хранятся по соображениям производительности. Это затрудняет анализ приложений curses на предмет утечек памяти. Чтобы обойти это, создайте отладочную версию библиотеки ncurses, которая освобождает те порции, которые она может, и предоставляет _nc_free_and_exit() функция для освобождения остатка при выходе. Утилита ncurses и тестовые программы используют эту функцию, например, через ExitProgram() макро.

4

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector