我正在做一個項目,使用Qt和用戶輸入的一些定製的QDialogs。由於我的開發盒硬件限制,我想監視我的應用程序的內存使用情況。我如何執行對話。因爲對話是一個局部變量,我期望它在堆棧上創建並在函數結束後立即銷燬(在第5行之後)。當應用程序反覆打開和關閉對話框時,它的內存使用量會增加,並且它永遠不會返回到初始值[任務管理器的列] ['Memory (Working Set)' and 'Memory (Private Working Set)'
]。我使用應用程序驗證程序,啓用所有基本測試,並且沒有顯示錯誤'。存儲器圖案看起來像如下(數值由式舉例說明的唯一的):無法檢測爲什麼QDialog是內存泄漏
- 申請開始(工作集= 12000K,私人組= 6000K)
- 打開對話框-1(工作集= 14000K,私人組= 7000K)
- 關閉對話框(工作集= 12010K,私人組= 6005K)
- 打開對話框-2(工作集= 14020K,私人組= 7000K)
- 關閉對話框(工作集= 12010K,私人套餐= 6008K)
- Open Dial OG-3(工作集= 14080K,私定= 7010K)
- 關閉對話框(工作集= 12040K,私定= 6008K)
- ...
因此,任何想法追查根問題的原因? (事實上,我也面臨着類似的問題,當QFileDialog getOpenFileName
,getSaveFileName
的使用靜態方法,並發現了一些討論here,但似乎沒有解決)
編輯我用QFormLayout在我的對話,我添加小部件通過layout->addRow("label text", mywidget);
,我懷疑對象破壞是否無法清除乾淨的標籤。
編輯我創建了一個測試程序,QDialog有十個QLineEdits,使用相同的add-widget策略。問題依然存在。 (會發生的問題進行這個測試程序,如果我創建並經常關閉對話框,說,在第二個10次)
mainwindow.h
#include <QMainWindow>
#include <QPushButton>
#include <QDialog>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
private:
QPushButton * button;
private slots:
void button_click();
};
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
};
mainwindow.cpp
#include "mainwindow.h"
#include <QApplication>
#include <QFormLayout>
#include <QLineEdit>
#include <QLabel>
MainWindow::MainWindow(QWidget *parent):QMainWindow(parent)
{
button=new QPushButton(this);setCentralWidget(button);
connect(button,SIGNAL(clicked()),SLOT(button_click()));
}
void MainWindow::button_click()
{
Dialog d(this);
d.exec();
}
Dialog::Dialog(QWidget *parent):QDialog(parent)
{
QFormLayout*layout=new QFormLayout(this);
setLayout(layout);
for (int i = 0; i < 10; i++)
{
layout->addRow(QString("%1").arg(i+1), new QLineEdit(this));
}
}
int main(int c,char *argv[])
{
QApplication a(c,argv);
MainWindow w;
w.show();
return a.exec();
}
平臺
- Win 7 x64,MinGW 4.7.2 x64(rubenvb-build),4GB ram
- 的Qt 4.8.5(內置本地使用上述工具鏈)
- Qt的造物主2.6.1
這絕對不是你如何創建對話框,看起來不錯。所以它必須在DlgPopConfig中。其他小部件內的小部件是安全的(父/子層次結構)。如果你使用標準的小部件(例如QDialog),試試看。如果您有權訪問OS X或Linux,請在valgrind中運行它。 – 2013-03-28 05:37:41
Qt 4.8.5?它是一個測試版嗎?嘗試4.8.4或4.7.4。你的測試應用程序看起來很好,所以它可能是一個QT問題。 – Amartel 2013-03-28 06:34:54
@Amartel,'Qt 4.8.5'從我的QtCreator的關於盒子被注意到。我的開發盒只有1套Qt(因爲構建64位庫需要幾天)。實際上,我直接從qt.gitorious.org下載了master.tar.gz並從中構建。 – 2013-03-28 06:48:04