LINUX.ORG.RU

Xlib: memory leaks

 , ,


0

2

Leaks here:

font_info = XQueryFont(display, XGContextFromGC(graphics_context))
XFreeFontInfo(NULL, font_info, 0);


Valgrind output:

$ valgrind --leak-check=full -s ./a.out 
==21020== Memcheck, a memory error detector
==21020== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==21020== Using Valgrind-3.16.1 and LibVEX; rerun with -h for copyright info
==21020== Command: ./a.out
==21020== 
==21020== 
==21020== HEAP SUMMARY:
==21020==     in use at exit: 3,424 bytes in 2 blocks
==21020==   total heap usage: 67 allocs, 65 frees, 104,734 bytes allocated
==21020== 
==21020== 352 bytes in 1 blocks are definitely lost in loss record 1 of 2
==21020==    at 0x48386CF: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==21020==    by 0x483AE07: realloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==21020==    by 0x48880B8: ??? (in /usr/lib64/libX11.so.6.4.0)
==21020==    by 0x488892C: XQueryFont (in /usr/lib64/libX11.so.6.4.0)
==21020==    by 0x1091B0: main (in /home/anonymous/xlib_test/a.out)
==21020== 
==21020== 3,072 bytes in 1 blocks are definitely lost in loss record 2 of 2
==21020==    at 0x48386CF: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==21020==    by 0x483AE07: realloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==21020==    by 0x48881CF: ??? (in /usr/lib64/libX11.so.6.4.0)
==21020==    by 0x488892C: XQueryFont (in /usr/lib64/libX11.so.6.4.0)
==21020==    by 0x1091B0: main (in /home/anonymous/xlib_test/a.out)
==21020== 
==21020== LEAK SUMMARY:
==21020==    definitely lost: 3,424 bytes in 2 blocks
==21020==    indirectly lost: 0 bytes in 0 blocks
==21020==      possibly lost: 0 bytes in 0 blocks
==21020==    still reachable: 0 bytes in 0 blocks
==21020==         suppressed: 0 bytes in 0 blocks
==21020== 
==21020== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)


Full code:

#include <stdio.h>
#include <X11/Xlib.h>

#define ERROR (-1)

#define WINDOW_START_POINT_X 200
#define WINDOW_START_POINT_Y 100
#define WINDOW_WIDTH 600
#define WINDOW_HEIGHT 400

int main(void)
{
	Display *display;
	int screen_number;
	Window window;
	GC graphics_context;
	XFontStruct *font_info;

	display = XOpenDisplay(NULL);
	if( !display )
	{
		fprintf(stderr, "Error: can't connect to X Server\n");
		return ERROR;
	}
	screen_number = XDefaultScreen(display);
	window = XCreateSimpleWindow(display, RootWindow(display, screen_number),
		WINDOW_START_POINT_X, WINDOW_START_POINT_Y,
		WINDOW_WIDTH, WINDOW_HEIGHT, 0, XBlackPixel(display, screen_number),
		XWhitePixel(display, screen_number));

	graphics_context = XCreateGC(display, window, 0, NULL);
	if( !(font_info = XQueryFont(display, XGContextFromGC(graphics_context))) )
	{
		fprintf(stderr, "Error: can't get font information\n");
		XFreeGC(display, graphics_context);
		XDestroyWindow(display, window);
		XCloseDisplay(display);
		return ERROR;
	}
	XFreeFontInfo(NULL, font_info, 0);
	XFreeGC(display, graphics_context);

	XDestroyWindow(display, window);
	XCloseDisplay(display);
	return 0;
}


Solve:

XFreeFontInfo(NULL, font_info, 1);



Последнее исправление: mrnkv (всего исправлений: 3)

Valgrind

А чего сразу valgrind? С ‘-g’ собрать не судьба и через gdb просмотреть?

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

На что смотреть

Ну ссылок у тебя всего две: *display, *font_info. Вот за ними в первую очередь и присмотри.

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

Ну ссылок у тебя всего две: *display, *font_info. Вот за ними в первую очередь и присмотри.

Течет тут:

font_info = XQueryFont(display, XGContextFromGC(graphics_context))
XFreeFontInfo(NULL, font_info, 0);


Вопрос - почему?

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

XFreeGC(display, graphics_context);
Не он?

Нет.


XQueryFont(...) alloc'чит 3520 байт,
XFreeFontInfo(...) освобождает 96.

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

If NULL is passed for names, no font names are freed.

С именами здесь не работаю


Допустим, проблема в этом.
Какие font names освобождать?

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

Допустим, проблема в этом.

Странная фигня:

Если для имен передается NULL, имена шрифтов не освобождаются.

Может стоит попробовать?:

XFreeFont()(display, font_struct)
      Display *display;
      XFontStruct *font_struct;

Сам шрифт будет освобожден, если на него не ссылается никакой другой ресурс.

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

Может стоит попробовать?:XFreeFont()

$ ./a.out 
X Error of failed request:  BadFont (invalid Font parameter)
  Major opcode of failed request:  46 (X_CloseFont)
  Resource id in failed request:  0x2c00002
  Serial number of failed request:  11
  Current serial number in output stream:  15


Тут все понятно: я шрифт не загружал, с чего мне его освобождать?

mrnkv
() автор топика
Последнее исправление: mrnkv (всего исправлений: 1)
Ответ на: комментарий от mrnkv

Тут все понятно

Ну да, логично. Хз, белиберда какая то.

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