XCreateFontCursor()を使用し、 XFreeCursor()で解放しても効果はありません。Valgrindを使用して、終了時にメモリを使用し続けます。
これを修正する方法はありますか?
私が理解できる限り、 XUndefineCursorの後、または未使用のカーソルで解放された後、他のリソースがそれを参照することはありません。
サンプルコード:
#include <stdio.h>
#include <unistd.h>
#include <X11/Xlib.h>
#include <X11/cursorfont.h>
int main(int argc, char *argv[])
{
int i;
Display *dpy;
int scr;
Window win = 0;
Cursor curs = 0;
if(!(dpy = XOpenDisplay(NULL))) {
fprintf(stderr,
"Unable to open display.\n"
);
return 1;
}
scr = DefaultScreen(dpy);
for (i = 1; i < argc; ++i) {
switch (argv[i][0]) {
case 'w':
win = XCreateSimpleWindow(
dpy,
XRootWindow(dpy, scr),
200, 200,
300, 200,
2,
XBlackPixel(dpy, scr),
XWhitePixel(dpy, scr)
);
XMapWindow(dpy, win);
XFlush(dpy);
break;
case 'c':
fprintf(stdout, "Creating cursor.\n");
curs = XCreateFontCursor(dpy, XC_diamond_cross);
if (win)
XDefineCursor(dpy, win, curs);
break;
case 'f':
if (curs) {
fprintf(stdout, "Freeing cursor.\n");
if (win)
XUndefineCursor(dpy, win);
XFreeCursor(dpy, curs);
} else
fprintf(stderr, "No cursor to free.\n");
break;
case 's':
fprintf(stdout, "Sleep 1 second.\n");
sleep(1);
break;
case 'u':
fprintf(stdout, "Flushing display.\n");
XFlush(dpy);
break;
}
}
fprintf(stdout, "Close and free display.\n");
XCloseDisplay(dpy);
return 0;
}
コンパイル:
gcc -Wall -Wextra -pedantic -std=c89 -o freecursor freecursor.c -lX11
走る:
# Test without cursor:
valgrind ./freecursor s u s
in use at exit: 0 bytes in 0 blocks
total heap usage: 55 allocs, 55 frees, 47,438 bytes allocated
# Test with cursor:
valgrind ./freecursor c u s f u
in use at exit: 21,680 bytes in 298 blocks
total heap usage: 698 allocs, 400 frees, 99,849 bytes allocated
# Test with cursor and window:
valgrind ./freecursor w c u s f u s
in use at exit: 21,680 bytes in 298 blocks
total heap usage: 698 allocs, 400 frees, 99,849 bytes allocated
# Test with cursor and window + no free of cursor:
valgrind ./freecursor w s c u s
in use at exit: 21,680 bytes in 298 blocks
total heap usage: 698 allocs, 400 frees, 99,849 bytes allocated
編集:何かが行われたようです。15の異なるカーソルを作成しようとしましたが、それらを解放しませんでした。Valgrindは、1つだけが作成されたかのように、「終了時に使用中」の同じバイト数を報告します。それでも、XCreateFontCursor
この効果があります。