متغيرات فئة ثابتة في المكتبة الديناميكية والبرنامج الرئيسي [مكرر

StackOverflow https://stackoverflow.com/questions/2624880

سؤال

أنا أعمل على مشروع يحتوي على فئة "A" التي تحتوي على فئة حاوية STL ثابتة. يتم تضمين هذا الفصل في كل من برنامجي الرئيسي وملف. لذا. يستخدم الفصل المُنشئ/المدمر الافتراضي (الضمني ، غير المعلن). يقوم البرنامج الرئيسي بتحميل الملف .So باستخدام dlopen () وفي Destructor ، يدعو DlClose (). يعطل البرنامج بعد الخروج الرئيسي عندما يستدعي GLIBC المدمر لمتغير عضو الفئة الثابت. يبدو أن المشكلة هي أنه عندما يتم استدعاء DLCLOSE () ، يتم استدعاء المدمر للمتغير الثابت ، ثم عندما يدعو GLIBC الرئيسية أيضًا ، مما يؤدي إلى حرة مزدوجة.

لدي سؤالان ، وهما:
1) في هذه الحالة بالذات ، لماذا لا توجد نسختان من المتغير الثابت (نعم ، أعلم أن هذا يبدو مثيرًا للسخرية إلى حد ما ، ولكن نظرًا لأن كل من البرنامج الرئيسي و. لذا ، لم يتم تجميع ملف "A" بشكل منفصل ، فلا ينبغي أن يكون لكل منهما كل منهما واحد؟)
2) هل هناك أي طريقة لحل هذه المشكلة دون إعادة كتابة الطبقة "A" لعدم احتواء متغيرات الأعضاء الثابتة؟

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

المحلول

تم حل هذا السؤال في سؤال آخر نشرته. في الأساس ، كانت هناك بالفعل نسختان من المتغير الثابت - واحدة في البرنامج الرئيسي وواحدة في المكتبة المشتركة ، لكن رابط وقت التشغيل كان يحل كلتا النسختين إلى نسخة البرامج الرئيسية. انظر هذا السؤال لمزيد من المعلومات:

يهيئ البرنامج الرئيسي والمكتبة المشتركة نفس المتغير الثابت في __static_initialization_and_destruction_0

نصائح أخرى

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

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