سؤال

أنا أستخدم 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 تعتني بالفقاء أو إذا كان يجب أن أفعل ذلك. الوثائق ليست مفيدة للغاية في هذه الحالة.

هل كانت مفيدة؟

المحلول

لأنك تقوم بإنشاء العناصر الفرعية باستخدام "جديد"، فعليك إلغاء تخصيصها بنفسك. راجع وظيفة QdeleteLL لطريقة سريعة للقيام بذلك.

هل هناك سبب لماذا تستخدمه جديدا لإنشاء هذه الحشوات؟ (من الواضح أن الكود الخاص بك مجرد مقتطف، لذلك يمكن استخدام المؤشرات وتم تمريرها في أماكن أخرى.) بشكل عام، إنه أكثر بساطة ببناءها فقط على المكدس حتى يحدث التدمير تلقائيا.

نصائح أخرى

مثل أي فئة حاوية أخرى في عمليا أي مكتبة C ++، تدميرها تنشط أيضا المدمر للعناصر في ذلك. هذا صحيح لبسط MyClass array[3], ، ل STL. vector<MyClass> ولل QList<MyClass> أيضًا.
للتأكد من تدمير كل شيء، تحتاج إلى التأكد من أن MyClass يحتوي على ديمقوت تخصه بالفعل جميع الموارد. إن وجود qlist من المؤشرات لا يتبع هذه القاعدة لأن المؤشرات لا تملك المدمرين. بدلا من ذلك، قد ترغب في استخدام SHARED_PTR المزيف أو اكتب غلاف المؤشر الذكي الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top