LINUX.ORG.RU

glXGetFBConfigs(): утечка памяти не смотря на XFree()


0

0

Код:

     1  #include <stdlib.h>
     2  #include <X11/Xlib.h>
     3  #include <GL/glx.h>

     4  int main()
     5  {
     6    Display *display;
     7    int screen_number;
     8    GLXFBConfig *glxfb_configs;
     9    int configs_number;

    10    display = XOpenDisplay(NULL);
    11    if (display == NULL) return EXIT_FAILURE;

    12    screen_number = DefaultScreen(display);

    13    glxfb_configs = glXGetFBConfigs(display, screen_number, &configs_number);
    14    XFree(glxfb_configs);

    15    XCloseDisplay(display);

    16    return EXIT_SUCCESS;
    17  }
Компилирую: gcc main.c -Wall -lX11 -lGL -o main. Запускаю: valgrind ./main. Результат:
==32255== LEAK SUMMARY:
==32255==    definitely lost: 386 bytes in 10 blocks.
==32255==      possibly lost: 0 bytes in 0 blocks.
==32255==    still reachable: 4,710 bytes in 6 blocks.
==32255==         suppressed: 0 bytes in 0 blocks.
Если закоментировать 13 и 14 строчки, то результат таков:
==32312== LEAK SUMMARY:
==32312==    definitely lost: 0 bytes in 0 blocks.
==32312==      possibly lost: 0 bytes in 0 blocks.
==32312==    still reachable: 22 bytes in 1 blocks.
==32312==         suppressed: 0 bytes in 0 blocks.

Вопросы: откуда утечки? что я делаю не так?

Попробуй строчки 13 и 14 занести в бесконечный цикл. Если потребление памяти будет расти постоянно - это действительно утечка памяти. Если постоянного роста не будет - это просто какая-то оптимизация внутри иксовых библиотек, чтобы реже выделять/освобождать память.

Deleted
()
Ответ на: комментарий от Deleted

Если 13 и 14 занести в цикл - результат не меняется. А вот если занести в цикл 10-15 строчки:
     1  #include <stdlib.h>
     2  #include <X11/Xlib.h>
     3  #include <GL/glx.h>

     4  int main()
     5  {
     6    Display *display;
     7    int screen_number;
     8    GLXFBConfig *glxfb_configs;
     9    int configs_number;

    10    int i;
    11    for (i=0; i<10; i++)
    12    {
    13      display = XOpenDisplay(NULL);
    14      if (display == NULL) return EXIT_FAILURE;

    15      screen_number = DefaultScreen(display);

    16      glxfb_configs = glXGetFBConfigs(display, screen_number, &configs_number);
    17      XFree(glxfb_configs);

    18      XCloseDisplay(display);
    19    }

    20    return EXIT_SUCCESS;
    21  }
То памяти утечёт в 10 раз больше:
==1068== LEAK SUMMARY:
==1068==    definitely lost: 3,860 bytes in 100 blocks.
==1068==      possibly lost: 0 bytes in 0 blocks.
==1068==    still reachable: 4,710 bytes in 6 blocks.
==1068==         suppressed: 0 bytes in 0 blocks.

Это нормально?

LinuxUser ★★★
() автор топика

--leak-check=full --show-reachable=yes

sf ★★★
()
Ответ на: комментарий от Deleted

Попробовал с бесконечным циклом. Память по чуть-чуть отжирается. Возможно это из-за фрагментации, а возможно и нет.

Запускал с --leak-check=full --show-reachable=yes. Не освобождённую память выделяли driGetDriver, XOpenDisplay, __glXInitialize, glXGetFBConfigs и даже XCloseDisplay. Если нужно могу добавить полный лог.

Вообще говоря главный вопрос вот какой: я делаю всё правильно или нужно какие-то ещё функции освобождающие память вызывать?

LinuxUser ★★★
() автор топика
Ответ на: комментарий от LinuxUser

> Попробовал с бесконечным циклом. Память по чуть-чуть отжирается. Возможно это из-за фрагментации, а возможно и нет.

Я всё-таки думаю, что это не утечка, а какая-то оптимизация внутри иксовых библиотек. Спроси в одном из списков рассылки xorg - там тебе точно скажут.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.