2

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この効果があります。

4

0 に答える 0