0

我对 Qt 中的内存泄漏有很大的问题。

问题是当我运行以下方法时:

qwidget->show();
qwidget->hide();
qwidget->setVisible(...);
qlabel->setText(...);
qwidget->setEnabled(...);

然后它泄漏内存。我不会即时创建任何对象。我在启动时创建了所有小部件,我只是一直隐藏和显示小部件并更改某些标签上的文本。当我删除这些方法时,它根本不会泄漏内存。

是否有人知道为什么会这样,或者是否有人知道引擎盖下发生了什么?还是 Qt 有内存问题?

我在发布模式下运行带有 Qt 5.0.1 x64 的 Windows 7 x64。


现在我添加了一个测试代码:

#include "qtmemoryleaktest.h"
#include "Content_Logs.h"

QWidget* m_placeholder;
bool m_toggle;

QtMemoryLeakTest::QtMemoryLeakTest(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

    m_placeholder = new Content_Logs(this);

    this->layout()->addWidget( m_placeholder );

    connect( ui.pushButton, &QPushButton::clicked, this, &QtMemoryLeakTest::toggleClick );
}

void QtMemoryLeakTest::toggleClick()
{
    if( m_toggle = !m_toggle )
    {
        m_placeholder->show();
    }
    else
    {
        m_placeholder->hide();
    }
}

每次单击按钮时,内存都会增加。在 20 分钟内从 8 mb 到 47 mb。但是如果将 Content_Logs 替换为 QWidget,则不会发生内存泄漏。所以我认为 Qts 自生成的 ui 类中存在错误?在 Content_Logs 我有标签、lineEdits、Spacers、TableWidgets、Checkboxes、DateTimeEdits、ComboBoxes 等等。

Conte_Logs 中的代码:

#include "Content_Logs.h"

Content_Logs::Content_Logs( QWidget* parent = 0 )
    : QWidget( parent )
{
    ui.setupUi( this );
}

Content_Logs::~Content_Logs()
{

}
4

0 回答 0