我在google上做了很多搜索,但我还是不确定。
cv::Mat ImageFromDisplay(int Width, int Height, int x, int y)
{
Display* display = XOpenDisplay(NULL);
Window root = DefaultRootWindow(display);
XWindowAttributes attributes = {0};
XGetWindowAttributes(display, root, &attributes);
XImage* img = XGetImage(display, root, x, y, Width, Height, AllPlanes, ZPixmap);
if (!img->data) {
cout << "No image data";
throw("No image data");
}
cv::Mat scene = cv::Mat(Height, Width, img->bits_per_pixel > 24 ? CV_8UC4 : CV_8UC3, img->data);
if (!scene.data) {
cout << "Error reading scene";
throw("Error reading scene");
}
cvtColor(scene, scene, CV_BGRA2BGR);
XFree(img);
XCloseDisplay(display);
return scene;
}
每当我使用此函数时,我稍后在返回的对象上使用cv :: Mat-&gt;版本,如下所示:
cv::Mat sceneImg = ImageFromDisplay(SCENE_WIDTH, SCENE_HEIGHT);
sceneImg.release();
一旦sceneImg超出范围,是否会清除此函数分配的所有内存?
我知道我在ImageFromDisplay中使用img调用free,并且我在ImageFromDisplay上调用XCloseDisplay,所以我假设这些数据结构的内存被清理干净了。我是否需要在调用sceneImg.release后删除sceneImg.data?
答案 0 :(得分:3)
Found a comment在我找到原始代码的同一个地方,指出内存泄漏。完全修复了我的程序。
......我想说布兰登提供的答案会泄漏记忆。 使用XDestroyImage(img);而不是XFree(img);在函数ImageFromDisplay
中