سؤال

أنا عالق حاليا فيما يتعلق ب Segfaurts (أحيانا SIGABRTS بسبب Bad Mallocs) كلما حاولت إضافة كيبرينج إلى QMAP ككاميرا داخل المدمرة من فئة Qwidget لدي - أعتقد أنه يحتوي على شيء له مع ضمني Qstring تقاسم النموذج والنطاق.

لدي qwidget يعمل كبرنامج فرعي في MDI، هذه Qwidget لديها عدد قليل من QGLWIDGET مثيلات Viewport المشتق كأطفال. في النافذة الفرعية هناك QMAP ملف مجمع يحتوي على إعدادات ملف المشروع، عند إغلاق النافذة الفرعية، تتم مكالمات Destructor Qwidget :: Deletechildren () الذي يحذف كل من Viewports. في Viewport Destructor يتم حفظ الإعدادات الحالية في إعدادات النافذة الفرعية، على سبيل المثال: giveacodicetagpre. يتم استدعاء

swin.setsetting () لكل من الخصائص التي أرغب في حفظها، "Swin" هي مرجع إلى فئة المجمع QMAP المحذوفة في نهاية Destructor النافذة الفرعية. كل شيء على ما يرام حتى نداء SetSetting ()، وهو فقط: giveacodicetagpre.

يعمل هذا الإعداد بشكل جيد لأول عرض Viewport ، في الدعوة الأولى () في الثانية، يحدث Segfault في: giveacodicetagpre.

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

في بعض الأحيان سأحصل على Sigabrt malloc (): تلف الذاكرة في المشغل + في سطر SetSetting () مثال الرمز الأول. ولكن مرة أخرى، في بداية تدمير Viewport الثاني، وليس الأول.

أعتذر عن سؤال أفضل للغاية، ولكن هناك كمية كبيرة من التعليمات البرمجية تنشر عبر العديد من وحدات الترجمة. أي أدلة لهذه المشكلة ستكون مساعدة كبيرة!

شكرا مقدما. كام


تحديث

قمت بتغيير نموذج التعليمات البرمجية الأول إلى: giveacodicetagpre.

كاختبار لقضايا النطاق. و في بعض الأحيان يعمل، وأوقات أخرى تقدم بالضبط نفس الخطأ؛ من المفترض أن يتم تدمير كومة الكومة QString، فإنه يعتمد فقط على ما إذا كان موقع الذاكرة قد تم الكتابة فوق أم لا. ولكن هذا لا معنى له أيضا، لأنني لا أتصل بحذف عليه، ولا يمكنني إغلاق التطبيق (مجرد نافذة من MDI Sub)!


المزيد من التعليمات البرمجية يتم إنشاء

Swin على كومة عند إنشاء نافذة فرعية جديدة. يتم إحضارها إلى Destructor فئة Viewport كمرجع من طريقة من نافذتي الفرعية: giveacodicetagpre.

sy_project هو (حاليا) فئة مجمع بسيطة ل QMAP. بلدي destructor فئة Viewport الأساسية كاملة هو هذا (فشل هنا، وليس في الفئة المشتقة): giveacodicetagpre.


valgrind

بعد استخدام memcheck valgrind، اكتشفت العديد من الإدخالات التي تبدو مشابهة لبلدي StackTrace. بعد أن استخدمها من قبل، ما زلت فكفي، لكن هذا قول أنه تم حذف فئة Sy_Project (المجمع ل QMAP) بعد أداة SETSESTINTING () ترك QMAP مع مرجع غير صالح؟ giveacodicetagpre.

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

المحلول

I think the Sy_project object your pointer and therefore references are pointing to is already destroyed by the time the destructor of Sy_abstractGLViewport is called. If you look into the valgrind listing, the destructor of Sy_project is called before the destructor of Sy_abstractGLViewport.

So when you call inline Sy_project& getProject() { return *project_; } within the Sy_abstractGLViewport destructor, you're dereferencing a dangling pointer.

نصائح أخرى

Hum... What happens if you change your code for something like this:

dir.append("/Projection");
sWin.setSetting(dir, static_cast<int>(camera_->getProjectionType()));

In the way you are doing a temporary copy is create and then bound to a reference-to-const, which should be ok. Afterwards, from this reference QMap will attempt to copy the argument, in this case, going through the implicit sharing mechanism of QString. I'm just wondering what could go wrong in there...

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