سؤال

لدي لينكس C++ تطبيق وأود أن اختبار مؤشر كائن من صحتها قبل dereferencing ذلك.ومع ذلك حاول/catch لا تعمل على لينكس بسبب خطأ تجزئة.كيف يمكن القيام بذلك ؟

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

المحلول

إذا كان لديك سيناريو حيث العديد من المؤشرات عبر التطبيق الخاص بك مرجع نفس محدودة-عمر الكائنات شعبية الحل هو استخدام دفعة المؤشرات الذكية. تحرير:في C++11, كل من هذه الأنواع متوفرة في المكتبة القياسية

كنت ترغب في استخدام shared_ptr عن مؤشر(s) التي هي المسؤولة عن عمر من وجوه الخاص بك ، weak_ptr عن المؤشرات الأخرى التي قد تصبح غير صالحة.سترى أن weak_ptr لديه صلاحية التحقق كنت طالبا بنيت في.

نصائح أخرى

وهناك خطأ تجزئة ليست استثناء (مثل NullPointerException جاوة)؛ وهو إشارة المرسلة من نظام التشغيل لهذه العملية. إلقاء نظرة على وmanpage لsigaction للحصول على مؤشرات حول كيفية تثبيت معالج لل خطأ تجزئة (SIGSEGV).

وتهيئة المؤشر إلى NULL. إذا بعد بعض المعالجة فإنه لا يزال NULL انها غير صالحة، وإلا فإنه من صالح.

هل يمكن تمكين معالج إشارة لSIGSEGV لهذا اقعة واحدة. راجع صفحة رجل "إشارة" للحصول على التفاصيل. والبديل الآخر هو استخدام الإشارات التي هي مضمونة لتكون صالحة. ذلك يعتمد على التطبيق الخاص بك بطبيعة الحال.

وليس هناك طريقة عالمية الطبيعية مع مؤشرات الخام C ++. يفترض C ++ التي سوف تتبع تلك المعلومات.

في معظم الحالات، يمكنك التعامل مع هذه بتذكر لوضع المؤشرات إلى NULL عندما تكون غير صالحة. مؤشرات جديدة في البداية لا تشير يجب تعيين لاغية والكائنات المحذوفة حديثا يجب أن المؤشرات الخاصة لتعيين NULL.

وكيف يمكنك اختبار مؤشر للصحة؟ قارن إلى NULL؟

وأفضل شيء تفعله هو تشغيل البرنامج تحت Valgrind . قد يكون خطأ في مكان مختلف تماما.

تحديث: في منصة Win32 وهناك شيء من هذا القبيل __except __try الذي يسمح للقبض على بعض الاستثناءات. بقدر ما أعرف ليس هناك ما يعادلها لينكس لهذه الميزة Win32 و.

إذا قمت بإرفاق معالج لSIGSEGV ليس هناك الكثير يمكنك القيام به إلى جانب تسجيل حقيقة أن الخطأ حدث وفشل بأمان. البرنامج هو في حالة غير محددة عندما يحدث هذا الانتهاك وبالتالي قد لا تكون آمنة لمواصلة عملية عادية.

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

ويتم تخزين مؤشرات في الكائنات. يتم تهيئة في منشئ، وربما إلى 0 (NULL). انهم المحذوفة في المدمر، وربما في المهمة ونادرا في وظائف أخرى. عندما المحذوفة في أعضاء آخرين من المدمر، وانهم تعيين فورا قيمة جديدة أو 0.

وعموما، فيما يتعلق فكرة غريبة جدا من "فحص مؤشر غير فارغة للتأكد من صحتها"، إلقاء نظرة على هذا المقال: <لأ href = "http://blogs.msdn.com/oldnewthing/archive/2006/ 27/9 / 773741.aspx "يختلط =" نوفولو noreferrer "> http://blogs.msdn.com/oldnewthing/archive/2006/09/27/773741.aspx (و" ينبغي أن يسمى حقا IsBadXxxPtr CrashProgramRandomly ")

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