所以我有这个方法:
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
对象是在程序启动时(主窗口)第一次构造的,并且在调用析构函数时(当我退出应用程序时)超出范围(对于我故意不删除objActivity
和objActivity
)的一些原因。