【问题标题】:How do I deallocate the memory create in this function?如何释放在此函数中创建的内存?
【发布时间】:2015-12-09 17:43:03
【问题描述】:

我在谷歌上做了很多搜索,但我仍然不确定。

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 on display,所以我假设这些数据结构的内存已被清理。调用sceneImg.release后是否需要删除sceneImg.data?

【问题讨论】:

  • 不知道 X 的东西,但对于 openCV 垫:你甚至不需要释放。一旦它超出范围并且没有被另一个变量引用,它的 .data 内存将被自动释放。 openCV mat 数据使用引用计数!
  • 我注意到您返回的是 cv::Mat scene 值。分配一次内存(在函数外)然后通过指针返回不是更好吗?
  • 这是一个很好的观点。我是一名业余 C++ 程序员,非常感谢您的建议。

标签: c++ opencv xlib


【解决方案1】:

Found a comment 在我找到原始代码的同一个地方,指出内存泄漏。完全修复了我的程序。

...我想说布兰登提供的答案泄漏内存。 使用 XDestroyImage(img);而不是 XFree(img);在 ImageFromDisplay 函数中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多