سؤال

أنا في حاجة لتحويل المؤشرات طويلة (SendMessage()) وأريد أن بأمان التحقق إذا كان المتغير هو الصحيح على الأخر.إذا كنت تفكر في القيام dynamic_cast ولكن هذا لن تعمل على الفئات التي لا الظاهري.ثم فكرت في القيام typeid ولكن هذا العمل حتى لا تمر مشتقة فار مقرا لها.

هل هناك أي طريقة للتحقق مما إذا كان المؤشر ما أتوقع أثناء وقت التشغيل?هل هناك طريقة يمكنني استخدام typeid لمعرفة ما إذا كان المؤشر هو نوع المستمدة من معين القاعدة ؟

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

المحلول

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

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

نصائح أخرى

والمرجعية الخاصة بك إلى SendMessage() يجعل ط يبدو وكأنه MS يندوز هو النظام الأساسي الخاص بك ثم في قواعد استخدام مؤشرات (ويندوز) ينصح القراءة. ذلك تفاصيل وظائف PtrToLong وPtrToUlong وغيرها من الامور مايكروسوفت توفر لك في مثل هذه الحالات.

ولا يمكنك استخدام typeid. وسوف يؤدي إلى انتهاك وصول إذا كنت تحصل على القمامة بدلا من مؤشر صحيح، لذلك الشيك هو لا معنى لها.

ما يجب عليك فعله، هو التفاف SendMessage ورمز الذي يعالج الرسالة إلى واجهة من نوع آمن واحدة. بهذه الطريقة سوف تكون قادرة على تمرير أشياء غير متوقعة إلى SendMessage، ولن تحتاج إلى أي شيكات على تلقي الجانب.

وC ++ نوع النظام يعمل في وقت الترجمة. بمجرد أن يلقي مؤشر إلى فترة طويلة، تفقد جميع المعلومات نوع. ومنذ فترة طويلة هو مجرد بت الكثير في الذاكرة. لا توجد وسيلة يمكنك تحديد أنه كان يشير إلى كائن.

وPTLib ( http://sourceforge.net/projects/opalvoip/ ) يستخدم PCLASSINFO ماكرو لتحديد العلاقات بين الطبقات. هذا يوفر وظائف مثل IsDescendant وGetClass.

وربما يمكن أن تنفذ شيئا من هذا القبيل.

وdynamic_cast يعمل عن طريق التحقق من التوقيع على الجدول أسلوب ظاهري. إذا كان لديك أية أساليب الافتراضية، لم يكن لديك VMT، وذلك أقول لكم سوف dynamic_cast لا تعمل. ومع ذلك، إذا كان لديك أي VMT، لديك على الإطلاق NO المعرفة حول الكائن الذي أشار إليه.

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

أنا لا أفهم حتى الآن ما سؤالك عن.

  • إذا كان ذلك هو ما إذا كان أو لا يمكنك أن تكون متأكدا من أن صب طويلة وسوف يعود العائد نفس قيمة عرض بأمان التحقق من نوع متغير
    بالنظر إلى "قواعد استخدام مؤشرات" MS-الموقع الأخرى المجيب على الأسئلة المرتبطة النوع المناسب أن يلقي هو UINT_PTR.لذلك يمكنك القيام به UINT_PTR v = reinterpret_cast<UINT_PTR>(ptr); بها جزءا لا يتجزأ من النوع الذي عكس ليلقي عليه العودة إلى المؤشر مرة أخرى.C++ القياسية تضمن الأصلي استعادة قيمة.(انظر الرابط أعطى أعلاه شرحي هذا).هذا موقع Microsoft بالمناسبة يقول أيضا أن WPARAM و LPARAM تغيير حجمها اعتمادا على المنصة.لذلك يمكن فقط استخدام هذا المتغير v و SendMessage ذلك.
  • إذا كان هذا هو كيف يمكنك التحقق من على الجانب الآخر إذا كان أو لم يكن المؤشر (تحويلها إلى بعض نوع مؤشر) يشير إلى بعض وجوه الجواب هو لا يمكنك.منذ كنت على ما يبدو غير متأكد من أي نوع المؤشر كان يستخدم لإرسال أنه لا يمكن تسجيل الوصول في الجانب المتلقي ما الديناميكي نوع المؤشر يشير إلى هو.إذا كنت تعرف نوع المؤشر على المرسل الجانب الخاص بك التحقق من شأنه أن يكون غير مطلوب في المقام الأول.

في ويندوز، ويوفر MFC طريقة لمعرفة ما اذا كان مؤشر معين يشير إلى موقع ذاكرة صالح (يتم ذلك من خلال محاصرة segfault). لا أتذكر اسم الدالة، لكنه هناك. ومع ذلك، فإنه لا يضمن أن محتويات الذاكرة أشارت إلى صحيحة. قد لا تزال لديها VMT صالح وتحطم التعليمات البرمجية. بالطبع، يمكنك اعتراض segfault نفسك ( نرى المعرفة MS قاعدة )

وأما بالنسبة للفحص إذا كان هناك شيء ينتمي إلى نوع، يجب أن يكون لديك فئة أساسية لتبدأ. إذا قمت بإجراء المدمر من الفئة الأساسية "افتراضية"، وجميع الفئات المشتقة يكون VMTs.

إذا يجب تجنب VMT بأي ثمن، لديك ليكون نوعا من descriminator أن يخبرك ما كنت تتعامل مع مثل نوع الحدث في الأحداث ويندوز من مايكروسوفت.

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