سؤال

لدي قطعة من التعليمات البرمجية تبدو مثل هذا:

TAxis *axis = 0;
if (dynamic_cast<MonitorObjectH1C*>(obj))
   axis = (dynamic_cast<MonitorObjectH1C*>(obj))->GetXaxis();

في بعض الأحيان يتعطل:

Thread 1 (Thread -1208658240 (LWP 11400)):
#0  0x0019e7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
#1  0x048c67fb in __waitpid_nocancel () from /lib/tls/libc.so.6
#2  0x04870649 in do_system () from /lib/tls/libc.so.6
#3  0x048709c1 in system () from /lib/tls/libc.so.6
#4  0x001848bd in system () from /lib/tls/libpthread.so.0
#5  0x0117a5bb in TUnixSystem::Exec () from /opt/root/lib/libCore.so.5.21
#6  0x01180045 in TUnixSystem::StackTrace () from /opt/root/lib/libCore.so.5.21
#7  0x0117cc8a in TUnixSystem::DispatchSignals ()
   from /opt/root/lib/libCore.so.5.21
#8  0x0117cd18 in SigHandler () from /opt/root/lib/libCore.so.5.21
#9  0x0117bf5d in sighandler () from /opt/root/lib/libCore.so.5.21
#10 <signal handler called>
#11 0x0533ddf4 in __dynamic_cast () from /usr/lib/libstdc++.so.6

ليس لدي أدنى فكرة عن سبب تعطله. obj ليست فارغة (وإذا كانت كذلك فلن تكون هناك مشكلة، أليس كذلك؟).

ما الذي يمكن أن يكون السبب وراء تعطل طاقم التمثيل الديناميكي؟

إذا لم يتمكن من الإرسال، فيجب أن يعود NULL لا؟

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

المحلول

بعض الأسباب المحتملة للحادث:

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

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

نصائح أخرى

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

if (MonitorObjectH1C* monitorObject = dynamic_cast<MonitorObjectH1C*>(obj))
{
    axis = monitorObject->GetXaxis();
}

وأنت لا تزال تعطل إذا بعض الصفحات الأخرى وحذف ما monitorObject نقطة لأو إذا الكائنات مجنونة القمامة، ولكن على الأقل مشكلتك ليست الصب ذات الصلة بعد الآن، وأنت لا تفعل dynamic_cast مرتين.

وكما أنها تعطل فقط في بعض الأحيان، أراهن انها مسألة الترابط. تحقق من كل ما يشير إلى "الكائنات":

grep -R 'obj.*=' .

وdynamic_cast سيعود 0 إذا فشل المدلى بها وكنت الصب إلى مؤشر، والتي هي قضيتك. والمشكلة هي أن لديك إما تلف كومة في وقت سابق من التعليمات البرمجية، أو لم يتم تمكين RTTI.

هل أنت متأكد من أن قيمة "الكائنات" تم تعريف بشكل صحيح؟

إذا على سبيل المثال وuninitialised أنه (أي عشوائي) لهم أنني يمكن أن نرى ذلك مما تسبب في وقوع الحادث.

هل يمكن تغيير قيمة الكائنات بخيط رفيع مختلف؟

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