Вопрос

Я использую довольно сложный 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 о сделке или мне следует это сделать.Документация в этом случае не очень информативна.

Это было полезно?

Решение

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top