QT 5使用外部字体的内存泄漏问题

本文探讨了在使用QT5加载第三方ttf字体时遇到的内存泄漏问题,通过发现并应用QFontDatabase::removeApplicationFont()解决了部分泄漏,并进一步定位到setFont导致的局部问题。最后,通过合理使用全局字体避免了内存泄漏。
摘要由CSDN通过智能技术生成

在使用QT5 加载第三方字体,比如仿宋或者思源ttf格式的时候,会遇到内存泄漏问题,现在记录一下。

  1. 使用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)的函数,使用了一下发现有效,遇到类似问题的朋友可以试试。

  1. setFont引发的内存泄漏

上面的内存泄漏问题解决之后,后来又经过多次测试,发现还是有内存泄漏(泄漏在100-200k左右),多次调试发现在于label->setFont(font)这行代码,只要注释掉就没问题。

另外还发现,setFont 中加载QT自身带有的字体就没有这个问题,只有加载第三方字体有这个问题。

经过多方查找也没有找到资料,只有个外国网友17年发现过类似问题,不会后来QT开发者以QT4不再维护为理由把问题给关了(汗。。。。。)
问题链接如下:
https://bugreports.qt.io/browse/QTBUG-59959

也不知道是QT的bug还是我的代码有问题,希望大佬们可以帮忙解答一下,多谢。

后续:
经过测试排查,这里的内存泄漏是字体使用不当造成的。之前使用时每次都是new一个对象,然后再调用setFont设置字体,频繁new的话,就会有内存泄漏的问题,后来将字体改为全局字体,只new一次,就没有内存泄漏了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值