繁体   English   中英

如何释放此函数中的内存创建?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM