gpt4 book ai didi

c++ - Qt5.3(mingw32)中删除QQuickView的内存管理问题

转载 作者:行者123 更新时间:2023-11-27 23:01:28 26 4
gpt4 key购买 nike

我们正在使用 Qt/Qml 开发一个应用程序(Qml 嵌入在 QWidget 中)。删除包含 QQuickView(嵌入式)的 QWidget 时,分配的内存不会完全释放。

通过向应用程序添加一个 QWidget,将分配大约 30MB 的内存,但是当 widget 删除时,将释放大约 20MB 的内存。

在QWidget的析构函数中,我删除了QQuickView实例,没有其他大对象。

另外,我很确定 QQuickView 没有正确释放内存。

如何释放 QQuickView 分配的整个内存?

注意:代码非常大(160000 行),因此我无法放置示例代码。

提前致谢...

最佳答案

我已经编写了一个快速测试以确定在创建和删除 QQUickWidget 时是否存在实际泄漏:

class Widget : public QWidget {
Q_OBJECT
public:
Widget(QWidget *parent = 0) : QWidget(parent) {
widget = 0;
count = 0;
resize(200, 200);
layout = new QVBoxLayout(this);
setLayout(layout);
QTimer * t = new QTimer(this);
t->setInterval(200);
t->setSingleShot(false);
t->start();
connect (t, SIGNAL(timeout()), this, SLOT(toggleQuickView()));
}

public slots:
void toggleQuickView() {
if (!widget) {
widget = new QQuickWidget;
widget->setSource(QUrl::fromLocalFile("d:\\main.qml"));
connect(widget, SIGNAL(destroyed()), this, SLOT(echo()));
layout->addWidget(widget);
} else {
layout->removeWidget(widget);
widget->deleteLater();
widget = 0;
}
}

void echo() {
PROCESS_MEMORY_COUNTERS memcount;
if (!GetProcessMemoryInfo(GetCurrentProcess(), &memcount, sizeof(memcount))) return;
qDebug() << ++count << "created and destroyed," << memcount.WorkingSetSize / (1024 * 1024) << "MB memory used";
}

private:
QVBoxLayout * layout;
QQuickWidget * widget;
int count;
};

它有一个计时器,可以创建/销毁一个 QQuickWidget,里面有一个加载的 QML 文件,虽然结果最初会上升,但内存使用会及时稳定下来,表明不太可能有Qt代码内存泄漏,如果确实发生内存泄漏,问题不在Qt,而在你自己的代码。

此外,值得一提的是,任务管理器实际上显示进程使用的内存少于 GetProcessMemoryInfo(),我认为后者是两者的更准确衡量标准。任务管理器读数也没有指示任何内存泄漏,尽管它的值波动更大。

这是输出:

1 created and destroyed, 41 MB memory used
2 created and destroyed, 44 MB memory used
3 created and destroyed, 44 MB memory used
4 created and destroyed, 48 MB memory used
5 created and destroyed, 48 MB memory used
6 created and destroyed, 48 MB memory used
7 created and destroyed, 48 MB memory used
8 created and destroyed, 48 MB memory used
9 created and destroyed, 48 MB memory used
10 created and destroyed, 48 MB memory used
11 created and destroyed, 52 MB memory used
12 created and destroyed, 52 MB memory used
13 created and destroyed, 52 MB memory used
14 created and destroyed, 52 MB memory used
15 created and destroyed, 52 MB memory used
16 created and destroyed, 52 MB memory used
17 created and destroyed, 52 MB memory used
18 created and destroyed, 52 MB memory used
19 created and destroyed, 52 MB memory used
20 created and destroyed, 52 MB memory used
21 created and destroyed, 53 MB memory used
...
50 created and destroyed, 53 MB memory used
...
100 created and destroyed, 53 MB memory used
...
200 created and destroyed, 53 MB memory used
...
500 created and destroyed, 53 MB memory used

关于c++ - Qt5.3(mingw32)中删除QQuickView的内存管理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27201876/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com