QListWidget内存泄漏

时间:2015-08-27 07:30:04

标签: c++ qt memory-leaks visual-leak-detector

所以我有这个方法:

void SomeClass::SomeMethod() {
   QString information;
   QListWidgetItem *dataline = new QListWidgetItem();

   information = "stuff & more stuff";

   dataline->setText(information);
   dataline->setFont(QFont("Monospace"));
   dataline->setStuff(moreStuff::things);

   //! listData is a pointer to QListWidget object.
   ui.listData->insertItem(ui.listData.count(), dataline);
} //! Boom, memory leak!

在Qt docs中,它说的是这样的:

  

如果您需要在特定列表中插入新项目   位置,然后它应该没有父窗口小部件。该   然后应使用insertItem()函数将其放在列表中。   列表小部件将获得该项目的所有权。

VLD(视觉泄漏检测器)每次调用该方法时都会检测到内存泄漏。

1)VLD实际上是否正确,并且存在内存泄漏?

2)还有另一种解决方法吗? (我尽量不分配dataline对象,并将其地址传递给insertItem方法,但似乎无效。

编辑: 这是包含ui对象的类:

#include "ui_Validator.h"

class Validator: public QMainWindow {
        Q_OBJECT
    public:
        Validator(QWidget *parent = 0);
        ~Validator();
    public slots:
        void stuff1();
        void stuff2();
        void stuff3();
        void stuff4(const QString &data);
        void stuff5(const Rats &data);
    signals:
        void startGeneratingSignal(Cat param);
        void stopGeneratingSignal(Dog param);
        void initStuff();
        void configStuff(Rats param);
        void stopThreadIOloop();
    private:
        Ui::Validator ui; //! This object is from Qt-generated ui_Validator.h.
        SomeThreadObj *objActivity;
        QThread *objActivity;
        SomeInterface interface;
    };

来自cpp文件的析构函数:

Validator::~Validator() {
    //! EDIT: It's ok, when this destructor is called, it means that all the application is closed, so there is no need for explicit cleanup, the OS will take care of that.
    ui.listData->clear();
    emit killIOloop();
    qDebug() << "~Validator";
}

因此,正如您所看到的,ui对象是在程序启动时(主窗口)第一次构造的,并且在调用析构函数时(当我退出应用程序时)超出范围(对于我故意不删除objActivityobjActivity)的一些原因。

0 个答案:

没有答案