将`ui.listView-> setModel(new QStringListModel(list));`导致内存泄漏

时间:2013-04-01 09:07:40

标签: c++ qt

您好,我目前正在学习QT。 我使用以下代码

QStringList list;
list << "item1" << "item2" << "item3" << "item4" << "item5";
ui.listView->setModel(new QStringListModel(list));

现在我的理解是ui.listView->setModel作为对堆上对象的引用传递。这个对象不需要删除吗?我应该在这里使用升压安全指针的任何建议吗?由于每次更新列表的内容时,我都必须调用最后一个语句来更新显示。

3 个答案:

答案 0 :(得分:0)

是的,在这种情况下你应该删除新的QStringListModel(列表),但如果你稍微更改你的代码,它将由你的listView完成:

ui.listView->setModel(new QStringListModel(list, ui.listView));

答案 1 :(得分:0)

很难从这么少的可用代码中分辨出来,但是你是在堆上创建一个对象,它的地址可能会丢失,因此存在潜在的内存泄漏风险。您应该自己定义一个指向对象的全局指针,并在需要新指针时定义它delete 更好的方法是创建一个包含对当前class的引用的小QStringListModel,并定义一些创建新方法的方法,同时删除旧方法。

class ListModelHolder {

 private:
    QStringListModel* model;

 public:
    ListModelHolder() { model = 0; }
    ~ListModelHolder() { if(model != 0) delete model; }

    set_model(QStringListModel* model) { this->model = model; }
    delete_model() { if(this->model) delete this->model; this->model = 0; }  
  };

仅作为一个例子。您可以将此对象保留在全局范围内,也可以根据需要保持全局。

答案 2 :(得分:0)

除非模型的父级是列表视图,否则

QListView::setModel不会获取模型或选择模型的所有权。这是因为模型可以在几个不同的视图之间共享。这意味着通常由您来照顾生活模型并手动删除它。

我建议您自己管理,并指向您班级中的模型。这也可以让您修改模型使用的字符串列表。