Как очистить сложный QList?

Я использую довольно сложный 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 ответа

Решение

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

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

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

Другие вопросы по тегам