سؤال
ولدي مؤشر إلى QScriptEngine
أنني مرورا منشئ فئة فوق طاقتها من Evaluator
الصف ويسند الى QScriptEngine *engine_
(فرعية الطبقة Property
Evaluator
، ويدعو هذا منشئ Evaluator
، فمررها لQScriptEngine
خصصت بالفعل). منشئ بدون وسائط يخلق مؤشر QScriptEngine
الجديد (فرعية الطبقة Generic
Evaluator
في هذا الطريق). في destructor I اختبار إذا engine_
لا NULL
، حذف المؤشر، ثم تعيينه NULL
. يجب أن مؤشر (engine_
) في Property
المستمدة الآن أيضا أن NULL
؟ شيئا يقول لي هذا ليس هو الحال. إذا لم يكن كذلك، كيف تتعاملون مع هذا الوضع؟ أنا في حاجة إلى QScriptEngine
أن يكون نفس مثيل طوال الوقت. QScriptEngine
ل= المشغل الخاص، أو أنني سوف تجنب مؤشر كل ذلك معا.
ورأيت بعض المعلومات عن المؤشرات المشتركة (boost::shared_ptr
وstd:tr1::shared_ptr
) في آخر السؤال SO. أنا بالفعل باستخدام دفعة للمكتبة التعابير المنطقية، لذلك ليس دفعة وارد إذا كان هذا هو أفضل طريقة للتعامل مع هذا. نأمل هناك وسيلة غير زيادة، لC ++ العام مشاريع المعرفة والمستقبل.
المحلول
ويمكنك حل هذا من خلال إعطاء واحدة من فئات (فئة A) مراقبة مدى الحياة من هذا المؤشر، جنبا إلى جنب مع طريقة 'جالبة. فإن فئة أخرى (الفئة B) ندعو دائما جالبة A كلما كان هناك حاجة المؤشر. وبهذه الطريقة، A يبقى في السيطرة على المؤشر في جميع الأوقات. الجانب السلبي هو وظيفة جالبة (فإنه سيتم على الأرجح مضمنة، لكنه ما زال على المراوغة الثاني). أيضا، B ستكون لدينا للتأكد من أن مؤشر لNULL الى حد كبير على كل استخدام.
لديك خيار آخر هو التفاف المؤشر في شيء من هذا القبيل دفعة :: shared_ptr الذي يعتني المشكلة (إذا ما استخدمت بشكل صحيح) من خلال عقد المؤشر الأساسي، وإلا حذفها عند حذف كافة الكائنات التي تشترك في هذا المؤشر. هل يمكن أن يكتب هذا بنفسك، ولكن لأن لديك بالفعل زيادة في اللعب، كنت مجرد استخدام تنفيذها.
وهناك خيار ثالث هو إعادة عامل كل شيء بحيث لا تحتاج مؤشر المشتركة. كنت شخصيا أبدا تصميم برنامج C ++ التي تحتاج إلى مؤشرات مشتركة، لمجرد انها المكان الذي البق إدارة الذاكرة يمكن أن زحف بسهولة في على مر السنين، ولكن هذا مجرد لي.