Как очистить сложный QList? - PullRequest
1 голос
/ 25 апреля 2009

Я использую довольно сложный QList в производной от QAbstractTableModel для хранения данных:

class MyTableModel : public QAbstractTableModel {
     Q_OBJECT   
     QList<QHash<int, QHash<int, QVariant> *> *> m_data;
     /*...*/
};

MyTableModel::~TMusicTableModel() {
     /* Should I deallocate QList items? */
}

MyTableModel::setData(int row, int col, int type, QVariant value) {
    /* inserting a new data field */
    QHash<int, QHash<int, QVariant> *> *row_hash = new QHash<int, QHash<int, QVariant> *>();
    QHash<int, QVariant> *role_hash = new QHash<int, QVariant>();
    type_hash->insert(type, value);
    row_hash->insert(col, type_hash);
    m_data.insert(row, row_hash);
    return true;
}

Мне интересно, позаботятся ли QList и QHashes о сделке или я должен это сделать. В этом случае документация не очень информативна.

Ответы [ 2 ]

5 голосов
/ 25 апреля 2009

Поскольку вы создаете подэлементы с помощью «new», вам необходимо освободить их самостоятельно. См. Функцию qDeleteAll для быстрого способа сделать это.

Есть ли причина, по которой вы используете new для создания этих хешей? (Ваш код, очевидно, всего лишь фрагмент, поэтому указатели можно использовать и передавать в другом месте.) Как правило, гораздо проще просто создать их в стеке, чтобы уничтожение происходило автоматически.

1 голос
/ 25 апреля 2009

Как и любой другой контейнерный класс практически в любой библиотеке C ++, его уничтожение также активирует деструктор элементов в нем. это справедливо для простого MyClass array[3], для STL vector<MyClass>, а также для QT QList<MyClass>.
Чтобы убедиться, что все уничтожено, вы должны убедиться, что MyClass имеет деструктор, который действительно освобождает все ресурсы. Наличие QList указателей не следует этому правилу, потому что указатели не имеют деструкторов. вместо этого вы можете захотеть использовать boost_sub_prer или написать собственную оболочку умного указателя.

...