当前位置: 代码迷 >> QT开发 >> QML动态创建对象出现内存泄漏,该怎么处理
  详细解决方案

QML动态创建对象出现内存泄漏,该怎么处理

热度:37   发布时间:2016-04-25 03:19:39.0
QML动态创建对象出现内存泄漏
为了清楚地阐述我的问题,我创建了一个小小的例子程序。这个程序是基于Qt5.3构建的,是一个QtQuick工程,大家可以下载实测一下。
我使用Qt.createComponent()和Qt.createObject()来动态创建对象,在这个对象中我加入了粒子系统,可以让其运行也可以不让其运行。结果发现即使使用someObject.destory()方法也无法让系统将该对象回收,结果导致严重的内存泄漏。

// TestObject.qml
import QtQuick 2.0
import QtQuick.Particles 2.0

Rectangle
{
    id: root
    width: 32
    height: 32
    color: "#" + ( Math.floor( Math.random( ) * 0xFFFFFFFF ) ).toString( 16 )
    x: Math.random( ) * parent.width
    y: Math.random( ) * parent.height

    NumberAnimation on x { from: parent.width / 2; to: x }
    NumberAnimation on y { from: parent.height / 2; to: y }

    Timer
    {
        id: internalTimer
        interval: 2000
        repeat: false
        onTriggered: root.destroy( )
    }

    ParticleSystem
    {
        id: system
        anchors.centerIn: parent
        running: root.parent.useParticle

        ImageParticle
        {
            source: "qrc:///particleresources/star.png"
            colorVariation: 0.2
        }

        Emitter
        {
            emitRate: 100
            lifeSpan: 1000
            size: 40
            enabled: true
            velocity: AngleDirection
            {
                angle: 360
                angleVariation: 180
                magnitude: 200
                magnitudeVariation: 20
            }
        }
    }

    function startTimer( ) { internalTimer.start( ) }
}


下面是主程序:

import QtQuick 2.2
import QtQuick.Controls 1.1

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Check memory leak")

    menuBar: MenuBar {
        Menu
        {
            title: qsTr("Option")
            MenuItem
            {
                id: qmlTestItem
                checkable: true
                checked: true
                text: qsTr("dynamic QML test")
            }
            MenuItem
            {
                id: useParticleItem
                checkable: true
                checked: false
                text: qsTr( "use particle" )
            }
        }
    }

    Rectangle
  相关解决方案