C++ QListWidget内存泄漏

C++ QListWidget内存泄漏,c++,qt,memory-leaks,visual-leak-detector,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"));

所以我有这个方法:

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) 还有别的办法解决这个问题吗?(我试图不堆分配
数据线
对象,并将其地址传递给
插入项
方法,但似乎不起作用

编辑: 这是保存
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";
}
Validator::~Validator(){
//!EDIT:没关系,当调用此析构函数时,意味着所有应用程序都已关闭,因此不需要显式清理,操作系统将处理此问题。
ui.listData->clear();
发射killioop();

qDebug()我用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()
{

}
关闭主窗口后,将调用QListModel析构函数并以clear方法删除ListWidget的所有项

VLD的输出:

No memory leaks detected.
Visual Leak Detector is now exiting.

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

我用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()
{

}
关闭主窗口后,将调用QListModel析构函数并以clear方法删除ListWidget的所有项

VLD的输出:

No memory leaks detected.
Visual Leak Detector is now exiting.

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

你确定这是内存泄漏吗?只有当
ui时,内存才会被释放。listData
将被销毁。在我看来,这不像是泄漏(基于显示的代码)。看看你是否能以某种方式(可能是一些注释注释)告诉VLD,这个指针将被存储在别处。如果没有这样的方法,那么我认为VLD一般不适合与QT应用程序一起使用,因为会有很多情况下,代码< >新< /代码>一个对象,然后把它传递给另一个拥有它的对象,就像在这个代码中一样。@这是VLD的输出:
------0x06315F28处的块980:24字节-------泄漏哈希:0x6A3FD59D,计数:1,总计24字节调用堆栈(TID 6756):0x52E8C260(文件和行号不可用):MSVCR120D.dll!运算符新c:\users\user\documents\visual studio 2013\projects\myappagain\File.cpp(284):app.exe!Class::MyLeakingMethod+0xB字节
我不确定VLD是否正确,这就是为什么我要问的原因。@MariusMG对VLD没有过期限制,但我认为,
listData
只有在
ui
被销毁时才会被销毁,所以,实际上,在程序结束时。您可以尝试在上调用
clear
在程序结束前取消>listData
。或者只写一个简单的例子,测试一下
listData
是否被正确释放。类似的问题,不幸的是没有解决办法:你确定是内存泄漏吗?只有当
ui.listData
将被销毁时,内存才会被释放。在我看来不像是泄漏(基于显示的代码).看看你是否能做到(可能会有注释)告诉VLD,这个指针将被存储在别处。如果没有这样的方法,那么我认为VLD一般不适合与QT应用程序一起使用,因为会有很多情况下,代码< >新< /代码>一个对象,然后把它传递给另一个拥有它的对象,就像在这个代码中一样。@这是VLD的输出:
------0x06315F28处的块980:24字节-------泄漏哈希:0x6A3FD59D,计数:1,总计24字节调用堆栈(TID 6756):0x52E8C260(文件和行号不可用):MSVCR120D.dll!运算符新c:\users\user\documents\visual studio 2013\projects\myappagain\File.cpp(284):app.exe!Class::MyLeakingMethod+0xB字节
我不确定VLD是否正确,这就是为什么我要问的原因。@MariusMG对VLD没有过期限制,但我认为,
listData
只有在
ui
被销毁时才会被销毁,所以,实际上,在程序结束时。您可以尝试在上调用
clear
在程序结束之前取消列表数据。或者只写一个简单的例子,测试是否正确释放了列表数据。类似的问题,不幸的是没有解决方案:Odd,你在使用什么IDE?Odd,你在使用什么IDE?