1

Ncurses でカレンダーを作成しています。つまり、メモリを動的に割り当てて解放する必要があります。問題は、Valgrind --leak-check=full が new_item 関数でメモリ リークを示していることです。これが私のコードです。私は何を間違っていますか?

unordered_map<int, ITEM**> 

void NcurInterface::printMenu(GUIITEMS menu, GUIITEMS win)
{   
    typedef ITEM *items;
 // Create items
    int i;
    items *mitem = (ITEM**)new items[manager->getNmbMenuItems(menu) + 1];
    for(i = 0; i < manager->getNmbMenuItems(menu); i++) {
        mitem[i] = new_item(manager->getMenuItemsString(menu, false, i).c_str(), manager->getMenuItemsString(menu, true, i).c_str());
    }
    mitem[i] = ((char)NULL);
    setMenuItems(menu, mitem); // Insert in map
}

void NcurInterface::freeMenuItems(GUIITEMS menu)
{   
    items *clr = menuItems[menu];
        for(unsigned char i = 0; i < manager->getNmbMenuItems(menu) + 1; i++) {
            free_item(clr[i]);
        }
    menuItems.erase(menu);
    delete[] clr;
}

Valgrind 出力

2 ブロックの 1,056 (直接 192、間接 864) バイトは、0x4C282B8: calloc (/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so 内) で 0x5491226: new_item (/usr 内) の損失レコード 62/92 で確実に失われます。 /lib/x86_64-linux-gnu/libmenu.so.5.9) by 0x4137BC: NcurInterface::printMenu(GUIITEMS, GUIITEMS) (NcurInterface.cpp:220) by 0x413467: NcurInterface::updateMenu(GUIITEMS, GUIITEMS, GUIITEMS) (NcurInterface .cpp:185) by 0x417810: メイン (NcurInterface.cpp:754)

4

1 に答える 1

0

OP は次のように書いています。

問題が解決しました!メニューは最初に投稿を取り消す必要があり、その後で解放でき、最後にアイテムを解放できます。もうメモリリークはありません!

于 2015-07-03T22:17:18.607 に答える