Как исправить утечку памяти в простейшей программе FLTK?

У меня проблема с памятью в программе на C++ с FLTK. В этом первом случае:

#include <Fl/Fl.H>
#include <Fl/Fl_Window.H>

enum {
    win_w = 640,
    win_h = 480,
    btn_w = 80,
    btn_h = 30
};

int main()
{
    Fl_Window *window = new Fl_Window(win_w, win_h, "Hello, World!");
    window->end();
    window->show();
    return Fl::run();
}

valgrind сказал, что:

HEAP SUMMARY:
==2746==     in use at exit: 711,091 bytes in 846 blocks
==2746==   total heap usage: 13,330 allocs, 12,484 frees, 2,751,634 bytes allocated
==2746== 
==2746== LEAK SUMMARY:
==2746==    definitely lost: 0 bytes in 0 blocks
==2746==    indirectly lost: 0 bytes in 0 blocks
==2746==      possibly lost: 0 bytes in 0 blocks
==2746==    still reachable: 711,091 bytes in 846 blocks
==2746==         suppressed: 0 bytes in 0 blocks
==2746== Rerun with --leak-check=full to see details of leaked memory

Если я добавлю Fl_Button в эту программу, у нас будет гораздо больше утечек памяти.

    ...
    Fl_Window *window = new Fl_Window(win_w, win_h, "Hello, World!");
    Fl_Button *btn = new Fl_Button(win_w / 2 - btn_w / 2, win_h / 2 - btn_h / 2, btn_w, btn_h, "Button!");
    window->end();
    ...

==2791== HEAP SUMMARY:
==2791==     in use at exit: 1,065,964 bytes in 6,005 blocks
==2791==   total heap usage: 25,233 allocs, 19,228 frees, 6,637,915 bytes allocated
==2791== 
==2791== LEAK SUMMARY:
==2791==    definitely lost: 5,376 bytes in 19 blocks
==2791==    indirectly lost: 3,371 bytes in 128 blocks
==2791==      possibly lost: 0 bytes in 0 blocks
==2791==    still reachable: 1,057,217 bytes in 5,858 blocks
==2791==         suppressed: 0 bytes in 0 blocks
==2791== Rerun with --leak-check=full to see details of leaked memory

С одной стороны, это нормально, потому что мы не освобождаем память. С другой стороны, можно сказать, что это классический пример программы FLTK. Являются ли утечки памяти нормальными в FLTK? И если это нормально, то почему это не должно привести к проблемам, если программа работает непрерывно уже очень долгое время?


person Bogdasar    schedule 24.01.2021    source источник
comment
On the other hand, this can be said to be a classic example of a FLTK program. не все примеры хороши. Пример основан на том, что ОС освобождает всю память, выделенную приложению, когда приложение выходит. Но это не значит, что это хорошая практика.   -  person t.niese    schedule 25.01.2021
comment
Я предполагаю, что вы можете поместить значение, возвращаемое из Fl::run();, в переменную, затем delete window; и вернуть это значение в end main.   -  person drescherjm    schedule 25.01.2021
comment
@drescherjm я пробовал, не работает   -  person Bogdasar    schedule 25.01.2021


Ответы (2)


Как уже упоминал @drescherjrn, вы можете удалить окно после запуска. Что-то вроде

int main()
{
    Fl_Window *window = new Fl_Window(win_w, win_h, "Hello, World!");
    window->end();
    window->show();
    int rv = Fl::run();
    delete window;
    return rv;
}

В качестве альтернативы в C++ есть механизм для этого: auto_ptr (http://www.cplusplus.com/reference/memory/auto_ptr/auto_ptr/)

#include <memory>
int main()
{
    std::auto_ptr<Fl_Window> window(new Fl_Window(win_w, win_h, "Hello, World!"));
    window->end();
    window->show();
    return Fl::run();
}
person cup    schedule 25.01.2021

Ты можешь попробовать:

int main()
{
    Fl_Window *window = new Fl_Window(win_w, win_h, "Hello, World!");
    window->end();
    window->show();
    int retval = 1;
    if (Fl::run())
        retval =0;
    delete window ;
    return retval ;
}
person Himanshu Saxena    schedule 25.01.2021