当前位置: 代码迷 >> QT开发 >> qml 内存泄露有关问题
  详细解决方案

qml 内存泄露有关问题

热度:70   发布时间:2016-04-25 04:29:36.0
qml 内存泄露问题
qml和c++交互 用的modelist 会造成内存泄露。大家如何处理的?

------解决方案--------------------
是的,每次都会增长一点~别的组件也会这样吗
------解决方案--------------------
数据量很大吗?不大的话不用太关心这种问题。

C程序员有强迫症,我写代码的时候总是想着执行效率,其实花时间优化对现在的CPU来说快那么一点点已无意义。

漏个几M内存没啥,进程结束时会释放的。




------解决方案--------------------
不好意思,我以为是非常驻程序呢。

你说的是ListModel吧?

如果ListModel不是为了显示的话,我会在javascript空间里var一个数组什么的,用c++填入数据。

如果用于显示的话就弃用ListModel,用js里的数据动态生成显示。反正ListModel也不是很好用。

对于硬件不富裕并且是工业级应用的话我更倾向于纯C++,心里托底,qml还不是很成熟,小bug我就发现不少。类似弹出提示框的组件都有可能会要你进程的命,时间充足的话你就试试看吧。

如果交互不复杂的话推荐你用QWidget里的paintEvent自已画吧,美工做好界面,用drawPixmap和drawText就行的。响应mousePressEvent等等即可。活有点糙,但稳当。

------解决方案--------------------
你是说用到ListView上吗?

js数组不能直接用,我是用js函数动态更新ListModel。ListModel有clear()接口的,只是从没注意过clear后内存是否泄露的问题。

qml和js都是解释性的语言,想要它们管理好内存不现实的。js的内存回收记得好象是类似于.net ,就是说无法控制系统真的实时释放那一部分内存,那等系统觉得该去施放内存了才会真的释放掉。qml类似于css而且和js同一空间,我想和js的回收机制会有千丝万缕的联系。

铁心要用qml的话你暴力测试一下,看看能否泄露到程序崩溃,我猜到一定程度后会有回收机制出来干预的。对于精确释放qml占用的内存我持99%纯度的悲观态度。



------解决方案--------------------
js数组不能直接用的。我是用js函数动态更新ListModel.

js和qml都是解释性的语言,内存回收类似于.net ,我对精确释放占用内存持决对悲观态度。

不过你可以暴力测试一下,看看能否泄露到程序崩溃,我想到一定程序会有回收机制跳出来干预的。

还有个变通的方式,就是你在ListModel预生成一定数据条数,要更新的话就依次付值,不要clear后再append.数据太多就做一下分页。没有动态分配内存也就没有泄露了吧,不知你具体应用场景,仅供参考。


------解决方案--------------------
不过以我的qml经验真的很担心你用qml做工业级应用,现在回头成本算低的。

就算不回头也要和你上司通个气,打个预防针,想好退路哦。
------解决方案--------------------
你的情况看起来有点复杂啊,c++端也有界面?不是纯qml界面?你的表述我也没完全理解。

到一定极限后将停止增加,是否意味着有回收机制在起作用?暴力测试了没?

C++端的内存回收是完全可信任的,只要你delete掉。
你试下这句,先new几十个,看下内存再delete掉,看下是否是操作系统内存用量显示有问题。
QPixmap* mBg=new QPixmap("res\\pic\\bg.png");

依你的情况还是先做完项目吧再扣细节吧,也许验收测试时一切OK也说不定
  相关解决方案