qml和c++交互 用的modelist 会造成内存泄露如何处理
qml和c++交互 用的modelist 会造成内存泄露。大家如何处理的?
Using a standard QList instead of QDeclarativeListProperty, will not take care of memory management and can cause your application to leak. In addition QList does not provide notification signals when children change 内存泄露,给毛的List例子啊
不好意思,我以为是非常驻程序呢。
你说的是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做工业级应用,现在回头成本算低的。
就算不回头也要和你上司通个气,打个预防针,想好退路哦。
|