0

我试图强调我的程序,它基本上用不同数量的行更新 QTableWidget

每次我做一些动作时,我都想修改表格的大小,但在它之前如果想清除它并用它来清除它的单元格内容。

我正在经历的是,从我的资源监视器监控的堆只会增加。

这是我在应用程序中按下按钮时运行的部分代码:

MyClass::updateTable(int nrows)
{
    ui->tableWidget->clearContents(); // this is to free the memory but the heap always grows
    for (int i=0; i<nrows; i++)
    {
        // I don't like this new I don't know when the destructor is called here!!
        QTableWidgetItem *item = new QTableWidgetItem();
        item->setText("SOMETEXT");
        ui->tableWidget->setItem(i,0,idItem);
    }
}

从 指定的行数 int nrows是一个非常可变的数字(从 10 到 10^5 )。

如何从堆中完全清除内存?

4

1 回答 1

0

那个新的是必要的。奇怪的是 clearContents() 应该摆脱它们。您可以使用的另一个函数是 clear() 函数,但这两者之间的唯一区别是 clear 将首先删除标题,然后调用 clearContents(),它是实际删除项目的那个。

事实上,看看这些函数的代码:

void QTableModel::clear()
{
    for (int j = 0; j < verticalHeaderItems.count(); ++j) {
        if (verticalHeaderItems.at(j)) {
            verticalHeaderItems.at(j)->view = 0;
            delete verticalHeaderItems.at(j);
            verticalHeaderItems[j] = 0;
        }
    }
    for (int k = 0; k < horizontalHeaderItems.count(); ++k) {
        if (horizontalHeaderItems.at(k)) {
            horizontalHeaderItems.at(k)->view = 0;
            delete horizontalHeaderItems.at(k);
            horizontalHeaderItems[k] = 0;
        }
    }
    clearContents();
}

void QTableModel::clearContents()
{
    for (int i = 0; i < tableItems.count(); ++i) {
        if (tableItems.at(i)) {
            tableItems.at(i)->view = 0;
            delete tableItems.at(i); //Your item should get deleted here
            tableItems[i] = 0;
        }
    }
    reset();
}

你确定这是你泄漏的地方吗?

于 2012-02-08T03:57:40.650 回答