سؤال

لقد انتهيت تقريبًا من أول تطبيق Symbian عملي، ولكن في تعلمي السريع، لم أولي سوى القليل من الاهتمام لإدارة الذاكرة والضغط على المكدس وتنظيفه؟

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

على سبيل المثال، إذا قمت بإمساك TDesC أو TPtrC16 داخل إحدى الوظائف، فكيف يمكنني بعد ذلك تنظيفهما بأفضل طريقة، هل هذا ببساطة؟

TPtrC16 temp = ...
temp.CleanupClosePushL();
CleanupStack::PopAndDestroy()

..لكل شيء؟

شكرًا وأرجو أن تسامحني، أنا معترف بذاتي بنظام Symbian n00b.

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

المحلول

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

وذكرت عدد قليل سيمبيان في الرد على هذا الموضوع . في حين أن كل تلك كانت مفيدة للغاية بالنسبة لي، لم أجد الكتاب <وأ href = "http://www.amazon.co.uk/Accredited-Symbian-Developer-Primer-Fundamentals/dp/0470058277" يختلط = "نوفولو noreferrer "> معتمدة سيمبيان المطور التمهيدي مفيدة للغاية. إذا كنت تستطيع الحصول على يديك على ذلك، أود أن أوصي بالتأكيد. ومن قراءة سريعة، ولكن هذا ما يفسر المفاهيم ببراعة، بما في ذلك الأشياء حول إدارة الذاكرة واصفات.

نصائح أخرى

لا يلزم تخزين الأشياء المخزنة في المكدس في مكدس التنظيف (ما لم تكن بحاجة إلى معالجة خاصة (فئات R وما إلى ذلك، انظر أدناه))

مكدس التنظيف مخصص لحذف الكائنات عند حدوث إجازة (فكر في الاستثناء)، والتي قد تؤدي إلى تسرب الذاكرة.

يتم الاستخدام الفعلي لمكدس التنظيف من خلال الوظائف الثابتة CleanupStack::PushL(..) وCleanupStack::Pop / PopAndDestroy.

بعض الفئات مثل RFile,RFs يجب أن يتم إغلاقها بدلاً من حذفها، لذلك بالنسبة لهذه الوظائف، يتم استدعاء وظيفة ::Close الخاصة بها لذا يجب عليك استخدام الوظيفة العامة CleanupClosePushL()، والتي بدلاً من استدعاء عامل الحذف على الكائن الخاص بك في إجازة، فإنه يستدعي وظيفة "::Close" بدلاً من ذلك.

للتحقق من وجود تسرب للذاكرة في التعليمات البرمجية الخاصة بك، يمكنك استخدام وحدات الماكرو __UHEAP_MARK؛و __UHEAP_MARKEND؛والذي سيتحقق من عدم ترك أي شيء في الكومة من بين هاتين المكالمتين.

إذا تركت أي شيء في حزمة التنظيف في CActive's::RunL، فسوف يصاب المجدول النشط بالذعر.

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

ويستغرق قليلا أقل من 10 صفحات لصحيح exmplain كل ما تحتاج لمعرفته حول CleanupStack وإدارة الذاكرة لسيمبيان C ++.

والمكونات وقح: كتب هذا الكتاب خصيصا لمستواك في n00bness: http://www.quickrecipesonsymbianos.com

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