在使用QT5 加载第三方字体,比如仿宋或者思源ttf格式的时候,会遇到内存泄漏问题,现在记录一下。
- 使用ttf字体
QStringList fontFamilies;
QFont font;
int fontId = QFontDatabase::addApplicationFont(":/font/simsun.ttf");
if(fontId != -1){
fontFamilies = QFontDatabase::applicationFontFamilies(fontId);
if(fontFamilies.count() != 0){
font,setFamily(fontFamilies.at(0));
label->setFont(font);
label->setPointSize(26);
label->setText("MyLable");
}
}
上面代码是使用第三方ttf字体文件的用法,但是实际使用过程中发现,多次调用之后会出现内存泄漏的问题,泄漏的还不少,每次有几M之多,网上没有查到好的说明,后来查看qt帮助文档,发现有个QFontDatabase::removeApplicationFont(fontId)的函数,使用了一下发现有效,遇到类似问题的朋友可以试试。
- setFont引发的内存泄漏
上面的内存泄漏问题解决之后,后来又经过多次测试,发现还是有内存泄漏(泄漏在100-200k左右),多次调试发现在于label->setFont(font)这行代码,只要注释掉就没问题。
另外还发现,setFont 中加载QT自身带有的字体就没有这个问题,只有加载第三方字体有这个问题。
经过多方查找也没有找到资料,只有个外国网友17年发现过类似问题,不会后来QT开发者以QT4不再维护为理由把问题给关了(汗。。。。。)
问题链接如下:
https://bugreports.qt.io/browse/QTBUG-59959
也不知道是QT的bug还是我的代码有问题,希望大佬们可以帮忙解答一下,多谢。
后续:
经过测试排查,这里的内存泄漏是字体使用不当造成的。之前使用时每次都是new一个对象,然后再调用setFont设置字体,频繁new的话,就会有内存泄漏的问题,后来将字体改为全局字体,只new一次,就没有内存泄漏了。