如何在我的程序中找到内存泄漏?

问题描述 投票:0回答:0

我正在使用 ncurses.h 和 C 构建一个基于终端的文件查看器项目。 它只是一个业余爱好的业余项目,并且只有几行代码。 我遇到了一些分段错误,我什至不知道它们在哪里,如果有人可以检查 window.c,我将不胜感激。

void render_dir(WINDOW *win)
{
    char **items_chars, *titulo, c;
    int i=0, x, y;
    int n;
    DIR *dir;
    ITEM **items;
    MENU *menu;
    char *path = get_current_dir();
    path = strcat(path, "/");
    dir = get_dir(path);
    items_chars = dir_items(dir);

    wclear(win);
    titulo = malloc(MAX_LENGTH * sizeof(char));
    strcpy(titulo, get_current_dir(path));
    mvwprintw(win, 0, 1, titulo);
    wrefresh(win);
    n = n_elements(items_chars);
    items = (ITEM **)calloc(n + 1, sizeof(ITEM *));

    for (int j = 0; j < n; j++)
    {
        items[j] = new_item(items_chars[j], "");
    }
    // final have to be NULL
    items[n] = (ITEM *)NULL;

    menu = new_menu(items);
    set_menu_win(menu, win);
    set_menu_sub(menu, derwin(win, 25, 40, 2, 1));
    // set_menu_fore(menu, A_NORMAL);
    set_menu_format(menu, 25, 1);
    set_menu_back(menu, COLOR_PAIR(1));
    post_menu(menu);
    wrefresh(win);
    while ((c = wgetch(win)) != '1')
    {
        switch (c)
        {
        case 'j':
            menu_driver(menu, REQ_DOWN_ITEM);
            if (i > n)
                i = n;
            else
                i++;
            //i++;
            wrefresh(win);
            break;
        case 'k':
            menu_driver(menu, REQ_UP_ITEM);
            if (i < 0)
                i = 0;
            else
                i--;
            //i--;
            wrefresh(win);
            break;
            break;
        case 'q':
            delete_window(win);
            exit(-1);
            break;
        case '\n':
            for (int j = 0; j < n; j++)
            {
                free_item(items[j]);
            }
            free_menu(menu);
            path = strcat(path, items_chars[i]);
            free(items_chars);
            free(titulo);
            closedir(dir);
            wclear(win);
            delwin(win);
            getmaxyx(stdscr, y, x);
            if (x < WDIM_X || y < WDIM_Y)
                win = init_window(WDIM_Y_MIN, WDIM_X_MIN, 5, 5);
            else
                win = init_window(WDIM_Y, WDIM_X, 5, 5);
            cd(path);
            free(path);
            mvwprintw(win, 20, 1, "s");
            render_dir(win);
            break;
        }
    }

    wrefresh(win);
}

我已尝试以各种方式释放所有内存,但它仍然存在分段错误和内存泄漏。

c clang ncurses curses
© www.soinside.com 2019 - 2024. All rights reserved.