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