我正在尝试使用X11 / Xutil库从屏幕获取像素,但是,根据valgrind,代码中似乎存在内存泄漏:

get_pixel.cpp

#include <iostream>
#include <X11/Xutil.h>

int main(int argc, char** argv)
{
    Display *display = XOpenDisplay(nullptr);

    int x = 10;
    int y = 10;
    XImage *image;
    image = XGetImage(display, RootWindow(display, DefaultScreen(display)),
        x, y, 1, 1, AllPlanes, XYPixmap);

    XColor color;
    color.pixel = XGetPixel(image, 0, 0);
    XFree(image);
    XQueryColor(display, DefaultColormap(display, DefaultScreen (display)), &color);
    std::cout << color.red/256 << " " << color.green/256 << " " << color.blue/256 << "\n";

    XCloseDisplay(display);
    return 0;
}

Valgrind输出

== 27380 ==堆摘要:
== 27380 ==在导出使用:1块中96字节
== 27380 ==总堆使用量:66个分配,65个释放,141,257个字节分配
== 27380 ==
== 27380 ==搜索指向1个未释放块的指针
== 27380 ==已检查141,304字节
== 27380 ==
== 27380 == 1个块中的96个字节肯定在丢失记录1 of 1中丢失
== 27380 ==在0x4C2CE5F:malloc(在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
== 27380 ==通过0x4E60BD6:XGetImage(在/usr/lib/libX11.so.6.3.0中)
== 27380 ==通过0x108BB8:主要(在/ home / cafeina /源代码/ MachineLearning /恐龙/ cpp / get_pixel中)
== 27380 ==
== 27380 ==泄漏摘要:
== 27380 == 绝对丢失:96字节(1块)
== 27380 ==间接丢失:0个字节,共0个块
== 27380 ==可能丢失:0字节,共0个块
== 27380 ==仍可到达:0字节,位于0块中
== 27380 ==已抑制:0个字节,共0个块
== 27380 ==
== 27380 ==错误摘要:来自1个上下文的1个错误(禁止显示:0至0)

我打算每秒读取数百次像素,因此需要摆脱这种内存泄漏。
有人知道这样做的正确方法吗?

谢谢

最佳答案

使用XDestroyImage(image)代替XFree(image)

07-27 13:58