【QT】表格控件+qt中没delete是否会内存泄漏

来源:互联网 发布:windows isa 编辑:程序博客网 时间:2024/06/05 18:27

功能截图:

表格控件的每一个单元格代表一个item,相互独立。
加入数据如下:
这里写图片描述

代码实现:

1、设置列数

   ui->tableWidget->setColumnCount(2);

2、设置标题

    QStringList hheader;    hheader.append("name");    hheader.append("score");    ui->tableWidget->setHorizontalHeaderLabels(hheader);

3、插入数据

    AddData("zzn","7");

4、AddData函数:

void MainWindow::AddData(const QString & name,const QString & score){  //行总数  int row=ui->tableWidget->rowCount();  //末尾插入新一行  ui->tableWidget->insertRow(row);  //显示分数  QTableWidgetItem *item=new QTableWidgetItem();//等号前面的声明,就代表item已经被分配空间,等待存地址了  item->setText(score);  ui->tableWidget->setItem(row,1,item); //这里有个未解决疑问,晚上请教大神。在调试总结有写。  //如果这里不delete掉item是不是会内存泄漏???  //下面item直接接管另一个新开辟的存储空间  //但是系统却认为指向上一个new空间的手没被砍断,然而实际上item已经不管他转身投入新人怀抱了  //显示名字  item=new QTableWidgetItem();  item->setText(name);  ui->tableWidget->setItem(row,0,item);}

调试总结:

1、setText是可以重复设置的,以最后一次设置为准。

2、关于new对象和内存泄漏问题:
我对new和delete的理解:
(1)item代表开辟了的一个内存空间,存放了地址,是存储着类QTableWidgetItem的某个对象的空间的地址;等号后面的new才表示真正开辟了一个存放QTableWidgetItem类对象的空间,通过item指针操作QTableWidgetItem对象的setText之类的成员啥的。item是一只很长很长的手,精确抓取操作QTableWidgetItem对象。
(2)delete是告诉内存,现在item不接管类QTableWidgetItem的某个对象的存储空间了,他们之间的联系“那只长长的手”被砍断了。但是此时,item的值仍然是原QTableWidgetItem对象的地址,只不过给原QTableWidgetItem某对象开辟的那块内存空间以后可以干别的用了,比如存个int啊啥的。
(3)如果item指针没被delete,而直接附新值,让他指向别的存储空间,那么原QTableWidgetItem对象就没指针接管了,此时内存已经找不到他了,他的地址已经丢了(在item被附新值之前,没有保留复制出来原来QTableWidgetItem对象的地址),变成了野指针?

代码的疑问:
在使用完item设置score后,想delete item,但最终显示的tablewidget里的score也没了。。
原示例代码里是没有delete操作的,难道不会内存泄露吗?

————————————————2017-6-14 18:47——————————————
大神果然是大神!
大神的说法是:一般没有特殊机制的情况下这样的使用(指向new对象的指针重新赋值却没有delete掉原指针)确实会内存泄漏。但在QT中,new出来的新控件(如上述情况中的QTableWidgetItem对象)的指针已经发送给他的父窗口管理,当父窗口注销时,子窗口也会被同时delete掉,不会发生内存泄漏。

原创粉丝点击