هل يجب وضع الطبقات المستمدة من غير QOBJECT "دائمًا" على المكدس؟

StackOverflow https://stackoverflow.com/questions/3412579

سؤال

قادمًا من عالم سيمبيان ، اعتدت على استخدام الكومة قدر الإمكان لتجنب نفاد مساحة المكدس ، خاصة عند التعامل مع الواصفات. تم دائمًا تخصيص فصول CBASE المشتقة ديناميكيًا على الكومة ، لأنه إذا لم تكن كذلك ، فستظل متغيرات أعضاءها غير مهيأة. هل تنطبق نفس الاتفاقية على الفصول المشتقة من QOBJECT؟

في QT يبدو أنه من الشائع وضع ، على سبيل المثال QString ، على المكدس. هل تم وضع محتويات السلسلة على الكومة بينما تعمل QString كحاوية على المكدس ، أم أن كل شيء وضعه على المكدس؟

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

المحلول

كما قال SJE397: من الاصطناعي أن نضع QString والحاويات على المكدس ، حيث يتم مشاركتها ضمنيًا. يتم إنشاء المؤشرات الداخلية الخاصة بهم (PIMPL INDIOM "D") على الكومة. لا فائدة من إنشاء الكائن نفسه على الكومة أيضًا. يسبب مجرد متاعب لإدارة الذاكرة وتفقد خصائص النسخ المقصودة على الكتاب عند تمرير المؤشرات إلى الأوتار/الحاويات حولها.

QObjects من ناحية أخرى ، تريد إنشاء الكومة في جميع الحالات تقريبًا ، وإلا فإنها سيتم تدميرها مرة أخرى على الفور. لا يمكن نسخها أو تعيينها (حسنًا ، يمكن للمرء أن ينفذها على فئات فرعية خاصة ، ولكن QObject يتم كسر الدلالات في ذلك الوقت) ، وعادة ما من المفترض أن ينجو من الجسم الذي يتم إنشاؤه فيه. الاستثناء هو QDialog, الذي يتم إنشاؤه غالبًا على المكدس ، يليه QDialog::exec, ، والذي يحجب حتى يتم إغلاق الحوار. ولكن حتى أن هذا غير آمن بشكل صارم ، حيث يمكن أن تتسبب حذف الحوار من قبل الوالد (إذا تم حذف الوالد نفسه) قبل عودة EXEC. ثم سيؤدي وجود مربع حوار على المكدس إلى حذف مزدوج عند استرخاء المكدس -> تعطل.

نصائح أخرى

QString ، والعديد من فئات QT الأخرى ، تستخدم مشاركة البيانات الضمنية. وهذا يعني أن الذاكرة يتم تخصيصها بشكل عام على الكومة.

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