Linux OpenGL应用程序导致Xorg泄漏
我正在开发一个相当大的Qt5/OpenGL应用程序。 每次应用程序在具有nvidia驱动程序的linux上运行并退出,且合成器处于活动状态时,nvidia smi显示Xorg进程的VRAM使用量增加了4Mb 我的立场是,即使我的应用程序泄漏,当它被销毁时,所有内容都应该被释放,但事实似乎并非如此 在这个帖子中,有人提到如果共享“显示列表”,情况就不会这样了 我对OpenGL了解不多,在网上也找不到关于这个问题的相关信息 我的目标是了解这是如何发生的,它可能来自我的代码中,以及如何修复它 注: 在我的应用程序停止后,Xorg中存在漏洞,nvidia smi中未显示Xorg和桌面环境相关的其他进程 我使用的DE并不重要(经过测试:KDE、Lxde、OpenBox、Gnome、Unity) 我使用的Linux发行版(几乎)并不重要(经过测试:Ubuntu 16.04、Ubuntu 18.04、fedora 26)(尚未在ArchLinux上复制,我们仍在调查此问题)Linux OpenGL应用程序导致Xorg泄漏,linux,qt,opengl,memory-leaks,nvidia,Linux,Qt,Opengl,Memory Leaks,Nvidia,我正在开发一个相当大的Qt5/OpenGL应用程序。 每次应用程序在具有nvidia驱动程序的linux上运行并退出,且合成器处于活动状态时,nvidia smi显示Xorg进程的VRAM使用量增加了4Mb 我的立场是,即使我的应用程序泄漏,当它被销毁时,所有内容都应该被释放,但事实似乎并非如此 在这个帖子中,有人提到如果共享“显示列表”,情况就不会这样了 我对OpenGL了解不多,在网上也找不到关于这个问题的相关信息 我的目标是了解这是如何发生的,它可能来自我的代码中,以及如何修复它 注: 在
nvidia驱动程序版本无关紧要,测试了340、384、390。通过密集的调试会话,问题得以解决 泄漏是由于删除之前包含QVTKOpenGLWindow的windowContainer的父级为空而导致的 当我们使用QOpenGLWidget时,这段代码就在这里,它没有引起任何问题。在任何情况下,在删除前为小部件设置NULL父项都是无用的,因此删除该行可以解决问题
即使在这种情况下,也不应该发生这种泄漏,所以我打开了一个Qt来报告它。只是想让隐秘的“啊,为什么我没有注意到呢?”闪开:你确定,你的进程实际上终止了吗?尽管最后一个窗口已关闭,但经常会忘记实际终止主事件循环/进程。这是一个很好的评论。是的,我肯定。我已经更新了我的问题。如果合成器不处于活动状态,漏洞就会消失。我不明白为什么要将该小部件的父项设置为NULL。不知道,2009年另一个开发人员做了这件事,可能与Qt4有关?我只知道这些。在任何情况下都没有理由这样做,因此删除它可以解决问题。