问题:

在写代码的时候发现一个问题,一般我们用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();

运行看一下:

Qt中的QTableWidget如何释放Item?

现在加入 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()。

相关文章: