繁体   English   中英

Qt 中的内存管理

[英]Memory Management in Qt

我对 Qt 内存管理有一点疑问。

我们以Listview为例,在listview中我们通过动态分配内存来添加每一项。 所以在这种情况下,我们是否需要手动删除所有“新”的项目。

例如:

Qlistview *list = new Qlistview;
QStandardItemModel  *mModel = new QStandardItemModel();
list ->setModel(mModel);

for(int I =0;i<10;i++)
{
QsandardItem *item = new QsandardItem(“Hi”);
mModel->appendRow(item);
}

在这个例子中,是否应该手动删除项目?

QStandardItemModel获取项目的所有权,因此在销毁模型时它们将自动删除。 您仍然需要删除模型本身(setModel()不会将模型的所有权转移到视图,因为多个视图可以使用一个模型)。

同意 chalup 的回答,你的问题的答案是:如果你调用了mModel->clear(); ,它会帮你删除所有这些项目,你不需要手动一个一个地删除项目,更重要的是如果你想完全删除模型,你应该调用delete mModel; .

这里运行ChrisW67提供的示例代码,你会有更好的理解:

#include <QCoreApplication>
#include <QDebug>
#include <QStandardItemModel>

class MyItem: public QStandardItem
{
public:
    MyItem(const QString & text): QStandardItem(text) {
        qDebug() << "Item created" << this;
    }
    ~MyItem()     {
        qDebug() << "Item destroyed" << this;
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QStandardItemModel* model = new QStandardItemModel;
    for (int row = 0; row < 4; ++row) {
        for (int column = 0; column < 4; ++column) {
            QStandardItem *item =
                new MyItem(QString("row %0, column %1").arg(row).arg(column));
            model->setItem(row, column, item);
        }
    }

    qDebug() << "Finished making model";
    model->clear();
    qDebug() << "Model cleared";
    qDebug() << "===================";
    QStandardItem *newitem1 = new MyItem(QString("new item"));
    qDebug()<<"create new item at"<<newitem1;
    QStandardItem *newitem2 = new MyItem(QString("new item"));
    QStandardItem *newitem3 = new MyItem(QString("new item"));
    QStandardItem *newitem4 = new MyItem(QString("new item"));
    //because we didn't delete model so far, we can still append items to model.
    model->appendRow({newitem1,newitem2,newitem3,newitem4});
    model->clear();
    qDebug() << "Model cleared again";

    //although the memoty of newitem1 has already been deallocated, but the pointer still point to that address, now newitem1 is a dangling pointer
    if(newitem1){
        qDebug()<<"newitem1 address is"<<newitem1;
    }
    else{
        qDebug()<<"newitem1 address in null";
    }
//    delete newitem1;//this will cause program crash because newitem1 acutally has been delete, double delete should not be allowed
    newitem1 = nullptr;//Instead of delete, wo could set newitem1 pointet to null, this can avoid wild pinter/dangling pointer
    delete model;
    qDebug()<<"deleted model";
    return a.exec();

我也在学习c++,如果上面有什么错误,请告诉我,我会更正。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM