【发布时间】:2017-08-09 11:17:40
【问题描述】:
我使用Component.createObject() 方法来动态创建一个对象。之后,我使用 destroy() 方法删除对象。
如果我在没有父参数(带有 null)的情况下调用方法 Component.createObject(null),那么 destroy() 方法会释放内存。如果我用一些parent 调用该方法,那么destroy() 方法不会释放大量内存。当创建大量对象时,这会导致超出 Windows 操作系统中每个进程允许的内存量,并导致应用崩溃。
重现问题的代码:main.qml
import QtQuick 2.8
Item {
visible: true
width: 640
height: 480
Scene {
id: scene
anchors.fill: parent
}
}
Scene.qml
import QtQuick 2.8
Item {
id: scene
Component.onCompleted: {
var tileComponent = Qt.createComponent("Tile.qml");
for (var i = 0; i < 200000; ++i) {
var tile = tileComponent.createObject(scene);
// var tile = tileComponent.createObject(null); // this works well, but I need a parent
tile.destroy();
}
}
}
Tile.qml
import QtQuick 2.8
Rectangle {
width: 100
height: 100
color: "orange"
}
在destroy() 之后,有父代的变体使用 40 MB 内存,没有父代 - 12 MB。如果我继续创建和销毁此类对象,使用的内存将继续增长。
如何动态创建和销毁大量具有父对象的对象以避免内存问题?
我已经在 Windows 7 x64 上测试了 Qt 5.9.1(MinGW 5.3.0 编译器)和 Qt 5.8.0(MSVC 2015)。
【问题讨论】:
-
我只能猜测:也许
parent包含对某个包装器的引用,该包装器未被删除。 -
我试图删除父级本身(动态创建场景,然后调用
destroy()),但没有帮助。
标签: qt memory-management qml