我正在尝试使用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)