![](/img/trans.png)
[英]How do I properly deallocate memory for a merged LL in the destructor function in c++?
[英]How do I deallocate the memory create in this function?
我在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-> release,如下所示:
cv::Mat sceneImg = ImageFromDisplay(SCENE_WIDTH, SCENE_HEIGHT);
sceneImg.release();
一旦sceneImg超出范围,是否会清除此功能分配的所有内存?
我知道我在ImageFromDisplay中使用img调用free,并且我在ImageFromDisplay上调用XCloseDisplay,所以我假设这些数据结构的内存被清理干净了。 在调用sceneImg.release之后是否需要删除sceneImg.data?
在我找到原始代码的同一个地方找到了评论 ,指出了内存泄漏。 完全修复了我的程序。
......我想说布兰登提供的答案泄漏了记忆。 使用XDestroyImage(img); 而不是XFree(img); 在函数ImageFromDisplay中
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.