问题:
在写代码的时候发现一个问题,一般我们用QTableWidget这样用:
tabWidget->setItem(0,0,new QTableWidgetItem("test"));
在传递参数的时候new了一个QTableWidgetItem,当tabWidget->clear的时候是否会释放掉先前new的QTableWidgetItem?
实验:
根据我们提出的问题,写个demo来验证一下看看。
tabWidget = new QTableWidget(1,1,this);
tabWidget->resize(100,100);
QTableWidgetItem *item = new QTableWidgetItem("test");
tabWidget->setItem(0,0,item);
qDebug()<<item->text();
运行看一下:
现在加入 tabWidget->clear();,如果clear能够释放Item,item->text()必定会引起异常(野指针)。
tabWidget = new QTableWidget(1,1,this);
tabWidget->resize(100,100);
QTableWidgetItem *item = new QTableWidgetItem("test");
tabWidget->setItem(0,0,item);
tabWidget->clear();
qDebug()<<item->text();
执行一下,发现并没有引发异常,但是打印消息为空,Item确实已经被释放了。(我们在释放一个指针的时候先delete p;后面一般会接一句p = NULL; delete只是告诉系统这块内存可以用了,但是内存内容还存在)
我们继续验证下,在clear和打印之间加入一些无用代码。
tabWidget = new QTableWidget(1,1,this);
tabWidget->resize(100,100);
QTableWidgetItem *item = new QTableWidgetItem("test");
tabWidget->setItem(0,0,item);
tabWidget->clear();
int i = 1;
qDebug() << i;
qDebug()<<item->text();
这时候我们再运行,程序就会异常了。
结论:
QTableWidget的clear函数会释放Item。同样效果的还有clearContents()、removeRow()。