Memory leak: Ui files and direct approach
The KDE codebase often uses a forward declaration in the .h-file to speedup compilation. The code often looks like this:
// header file namespace Ui { class MyWidget; } class MyDialog : public KDialog { // ... private: Ui::MyWidget *ui; };
The impl looks like this:
// source file #include "mydialog.h" #include "ui_mywidget.h" MyDialog::MyDialog() : KDialog() { QWidget *w = new QWidget(this); setMainWidget(w); ui = new Ui::MyWidget(); // allocation ui->setupUi(w); // ui->... }
See the memory leak? You have to call »delete ui;« in the destructor if you use the »direct approach«. Searching in lxr.kde.org shows lots of results, and in some places this delete is missing indeed. Happy fixing :)
Update: The really correct fix is to guard the pointer with an auto_ptr or scoped_ptr. For further details read the comments below. Or use another approach to include your ui-file.
- *If you do not want to delete it manually, you can for instance use a workaround like this:
// header file
namespace Ui { class MyWidget; }
class MyWidget;
class MyDialog : public KDialog {
// ...
private:
Ui::MyWidget *ui;
};
Source file:
// source file #include "mydialog.h" #include "ui_mywidget.h" class MyWidget : public QWidget, public Ui::MyWidget { public: MyWidget( QWidget * parent = 0 ) : QWidget( parent ) { setupUi(this); } }; MyDialog::MyDialog() : KDialog() { ui = new MyWidget(this); setMainWidget(ui); QWidget *w = new QWidget(this); setMainWidget(w); ui = new Ui::MyDialog(); // allocation ui->setupUi(w); // ui->... }