首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QListWidget内存泄漏

QListWidget内存泄漏
EN

Stack Overflow用户
提问于 2015-08-27 07:30:04
回答 1查看 774关注 0票数 1

我有这样的方法:

代码语言:javascript
复制
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对象的类:

代码语言:javascript
复制
#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文件中的析构函数:

代码语言:javascript
复制
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)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-27 08:20:32

我用VLD编写了一个简单的示例,代码如下:

代码语言:javascript
复制
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输出:

代码语言:javascript
复制
No memory leaks detected.
Visual Leak Detector is now exiting.

如果您调用ListWidget的clear方法显式:相同的输出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32243218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档