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?