如何释放glxChooseFBConfig返回的内存?

How to free memory returned by glxChooseFBConfig?

提问人:Irbis 提问时间:10/13/2023 更新时间:10/13/2023 访问量:51

问:

glxChooseFBConfig返回并按以下方式定义:GLXFBConfig*GLXFBConfig

typedef struct __GLXFBConfigRec *GLXFBConfig;

下面是一个使用和释放内存的示例函数:glxChooseFBConfig

void fun()
{
    const int attribs[] =
    {
        GLX_RENDER_TYPE, GLX_RGBA_BIT,
        GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT,
        GLX_X_VISUAL_TYPE, GLX_TRUE_COLOR,
        GLX_DOUBLEBUFFER, True,
        GLX_RED_SIZE, 8,
        GLX_GREEN_SIZE, 8,
        GLX_BLUE_SIZE, 8,
        GLX_ALPHA_SIZE, 8,
        GLX_DEPTH_SIZE, 24,
        GLX_STENCIL_SIZE, 8,
        None
    };

    Display* dpy = XOpenDisplay(NULL);
    int count = 0;
    GLXFBConfig* fbconfigs = glXChooseFBConfig(dpy, DefaultScreen(dpy), attribs, &count);

    //do something with fbconfigs

    for(int i = 0; i < count; ++i)
    {
        XFree(fbconfigs[i]);
    }

    XFree(fbconfigs);
}

我用标志编译我的应用程序。当我运行应用程序时,我收到一个清理程序错误:怎么了?-fsanitize=addressattempting double-free

c 免费 xlib 地址消毒剂 glx

评论

0赞 Adrian Mole 10/13/2023
文档中可以看出,您只需要废弃循环即可。(通常,在分配数组时,只需通过实际的数组指针即可释放它们。for
0赞 G.M. 10/13/2023
为什么要调用连续数组中的每个元素。你只需要.XFreeXFree(fbconfigs);
0赞 Irbis 10/13/2023
glXChooseFBConfig 是否返回 ** 类型?我以为数组和数组中的每个元素都是使用 malloc 分配的。
0赞 Adrian Mole 10/13/2023
请参阅我链接的文档:C 规范是GLXFBConfig * glXChooseFBConfig(...
2赞 G.M. 10/13/2023
数组中每个元素的基础类型很可能是指针本身,但就 API 而言,这是不透明的:它们可能指向由 GLX 代码本身管理的内部内存,因此不能释放。

答: 暂无答案