Toe*_*dev 15 c++ qt valgrind memory-leaks suppress-warnings
我无法创建一个Qt GUI应用程序,在valgrind中没有超过1K'肯定丢失'字节.我已经尝试过这个,制作只展示一个QWidget的最小应用程序,扩展QMainWindow; 只是创建一个QApplication对象而不显示它或不执行它或两者都没有,但它们总是泄漏.
试图解决这个问题我已经读过,因为X11或glibc有错误,或者因为valgrind给出误报.在一个论坛帖子中,似乎暗示在main函数中创建一个QApplication-object并返回对象的exec()函数,就像在教程中所做的那样,是一种制作GUI的"简化"方法(并不一定好) , 也许?).
valgrind输出确实提到了libX11和libglibc,还提到了libfontconfig.其余的记忆损失,5个损失记录,发生在??? in libQtCore.so期间QLibrary::setFileNameAndVersion.
如果有一种更合适的方式来创建GUI应用程序,甚至可以防止其中的一部分发生,那么它是什么?如果任何valgrind输出只是噪声,我如何创建一个抑制正确的抑制文件?
编辑:谢谢你的意见和解答!
我并不担心丢失的几个KB本身,但如果我不必过滤几个错误的屏幕但通常可以从valgrind获得"OK",那么找到我自己的内存泄漏会更容易.如果我要压制警告,我最好知道它们是什么,对吧?
有趣的是看到接受的泄漏是多少!
jst*_*ine 18
对于大规模支持多线程的库(如QT,wxWidgets,X11等)来说,设置单个类型的对象并在进程启动时初始化一次然后不尝试清理进程关闭时的分配.
我可以向你保证,任何从某个功能中"泄露"的东西QLibrary::setFileNameAndVersion()都是故意留下的.X11/glibc/fontConfig留下的内存可能也不是bug.
它可以被视为糟糕的编码实践或礼仪,但它也可以大大简化某些类型的任务.如今,操作系统提供了非常强大的保证,可以清除进程在被杀(优雅或强制)时被打开的任何内存或资源,以及在应用程序期间很可能需要的分配,包括关机程序 - 以及QT的各种核心组件都符合条件 - 然后,一旦加载/初始化,库就会设置一些内存分配,并且允许它们无限期地持续存在,这对性能有利.除此之外,这允许存储器供任何其他可能引用该存储器的C++析构函数使用.
由于这些分配仅设置一次,并且从代码中的一个点开始,因此不存在有意义的 内存泄漏的风险.它只是属于进程的内存,因此在操作系统关闭进程时会被清除.
结论:如果你的代码中没有内存泄漏,并且它似乎没有随着时间的推移而显着增大(并且这些日子显着增加,想想兆字节),和/或从第一次初始化设置代码明显开始只在您的应用程序中调用一次,然后不要担心它.这可能是故意的.