2013-03-28 38 views
3

我正在做一個項目,使用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 getOpenFileNamegetSaveFileName的使用靜態方法,並發現了一些討論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
+0

這絕對不是你如何創建對話框,看起來不錯。所以它必須在DlgPopConfig中。其他小部件內的小部件是安全的(父/子層次結構)。如果你使用標準的小部件(例如QDialog),試試看。如果您有權訪問OS X或Linux,請在valgrind中運行它。 – 2013-03-28 05:37:41

+0

Qt 4.8.5?它是一個測試版嗎?嘗試4.8.4或4.7.4。你的測試應用程序看起來很好,所以它可能是一個QT問題。 – Amartel 2013-03-28 06:34:54

+0

@Amartel,'Qt 4.8.5'從我的QtCreator的關於盒子被注意到。我的開發盒只有1套Qt(因爲構建64位庫需要幾天)。實際上,我直接從qt.gitorious.org下載了master.tar.gz並從中構建。 – 2013-03-28 06:48:04

回答

2

數月中下旬(使用上述工具鏈構建本地),但是這可能幫助遇到這個問題的下一個人。我使用PySide,但有相同的內存泄漏。原來有兩種選擇,取決於你需要從對話框中取回什麼信息:

1)安排完成後刪除對話框。

在Python,這看起來像:

dialog = MyDialog(self) 
dialog.exec_() 
# Do other things with dialog 
dialog.deleteLater() 

而且它看起來會在你的C++代碼相似:

void MainWindow::button_click() 
{ 
    Dialog d(this); 
    d.exec(); 
    // Do other things with d 
    d.deleteLater() 
} 

2)設置WA_DeleteOnClose屬性。

我結束了包括本在自定義對話框的構造函數:

self.setAttribute(PySide.QtCore.Qt.WA_DeleteOnClose) 

看起來應該像這樣在你的C++代碼:

Dialog::Dialog(QWidget *parent):QDialog(parent) 
{ 
    QFormLayout*layout=new QFormLayout(this); 
    setLayout(layout); 
    setAttribute(Qt::WA_DeleteOnClose); 
    for (int i = 0; i < 10; i++) 
    { 
     layout->addRow(QString("%1").arg(i+1), new QLineEdit(this)); 
    } 
} 

這兩項固定的內存泄漏給我的,除非偶爾會連續多次打開/關閉對話框,否則會偶爾泄漏4kb。對不起,以Python爲中心的答案 - 希望這可以讓人們指向正確的方向。