我有这样的方法:
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文档中,它的内容如下:
如果您需要在特定位置将一个新项插入到列表中,则应该在没有父部件的情况下构造它。然后,应该使用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)。
发布于 2015-08-27 08:20:32
我用VLD编写了一个简单的示例,代码如下:
test1::test1(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
QString information;
QListWidgetItem *dataline = new QListWidgetItem();
information = "stuff & more stuff";
//Dataline dataline = new Dataline();
dataline->setText("test");
dataline->setFont(QFont("Monospace"));
//! listData is a pointer to QListWidget object.
ui.listData->insertItem(ui.listData->count(), dataline);
}
test1::~test1()
{
}关闭MainWindow后,将调用QListModel析构函数,并在一个清除方法中删除ListWidget的所有项。
VLD输出:
No memory leaks detected.
Visual Leak Detector is now exiting.如果您调用ListWidget的clear方法显式:相同的输出。
https://stackoverflow.com/questions/32243218
复制相似问题