glxChooseFBConfig返回内存释放报错:attempting double-free问题排查
GLXFBConfig 双释放错误问题解析
问题背景
glxChooseFBConfig 返回 GLXFBConfig* 类型,而 GLXFBConfig 的定义是 typedef struct __GLXFBConfigRec *GLXFBConfig——本质上是一个指针的别名。示例代码中调用该函数后,先循环用 XFree 释放每个 fbconfigs[i],再调用 XFree 释放数组本身,使用 -fsanitize=address 编译运行时触发 attempting double-free 错误。
问题根源
- GLXFBConfig 的本质:它是指向 X 服务器内部维护的帧缓冲配置结构体的引用指针,并非客户端堆上分配的独立内存块。
glxChooseFBConfig返回的是一个指针数组,数组里的每个元素只是指向服务器资源的引用,不需要客户端单独释放。 - XFree 的使用逻辑:
glxChooseFBConfig分配的是存储这些指针的数组本身,这个数组需要用XFree释放;但数组内的每个GLXFBConfig指针不属于客户端管理的内存,调用XFree释放它们属于越界操作,会破坏内存结构。 - 双释放触发原因:错误地释放单个
fbconfigs[i]后,后续对数组本身的XFree操作会触及已经被错误释放的内存区域,或者这些指针指向的内存被服务器回收后再次被客户端释放,最终触发地址 sanitizer 的双释放检测。
正确处理方式
只需要调用一次 XFree 释放 glxChooseFBConfig 返回的整个数组即可,不需要循环释放数组内的单个元素:
// 假设已经通过glxChooseFBConfig获取到fbconfigs数组 XFree(fbconfigs);
内容的提问来源于stack exchange,提问作者Irbis
相关产品推荐
相关产品推荐

