2010-08-04 7 views
7

लिनक्स पर मेरे पास एक स्थिर लाइब्रेरी से कुछ उत्पन्न सी ++ कोड है जो वैश्विक चर को परिभाषित करता है। इस वैश्विक चर का एक उदाहरण दो साझा पुस्तकालयों के बीच साझा किया जाता है जो इसके प्रतीक का संदर्भ लेते हैं।लिनक्स पर, विनाशक C++ में वैश्विक चर के साझा उदाहरण पर दो बार क्यों चलाता है?

जब प्रक्रिया बंद हो जाती है और स्थिर समाप्ति चरण चलाया जाता है, तो मुझे लगता है कि इस साझा उदाहरण पर विनाशक दो बार चलाया जाता है! संभावित रूप से प्रति पुस्तकालय एक बार प्रत्येक अनलोड के रूप में।

यह प्रश्न हाल ही में देखा गया है: related question। यह एक ही व्यवहार की तरह लगता है, लेकिन यह क्यों हो रहा है के बारे में कोई चर्चा नहीं है।

क्या कोई इस व्यवहार के पीछे सैद्धांतिक स्पष्टीकरण जानता है?

+0

यह केवल संकलक उत्पन्न कोड द्वारा प्रति चर एक बार चलाना चाहिए। वैरिएबल का पता प्राप्त करने का प्रयास करें क्योंकि विनाशक यह सत्यापित करने के लिए चलाया जाता है कि यह वही वस्तु है। –

+0

शायद आपने कुछ स्मार्ट पॉइंटर क्लास में ऑब्जेक्ट में पॉइंटर संग्रहीत किया है, जो इसके टर्गर को नष्ट करने का प्रयास करता है। –

+0

तो वैश्विक पुस्तकालयों में से केवल एक (एक संकलन इकाई) में परिभाषित किया गया है? – Thomas

उत्तर

2

यदि आप नग्न पॉइंटर लेते हैं और इसे एक स्मार्ट पॉइंटर (दो बार) में रखते हैं, तो यह प्रत्येक कंटेनर शून्य पर गिरने के लिए दो बार नष्ट हो जाएगा।

तो, यदि आप दोनों पुस्तकालयों में नग्न सूचक को पास करते हैं, तो यह होगा। प्रत्येक व्यक्ति इसे एक साझा सूचक वस्तु में रखता है और उनमें से प्रत्येक विनाश करता है। यदि आप dtor के दौरान स्टैक बैकट्रैक देख सकते हैं, तो यह दोनों पुस्तकालयों में यह दिखाना चाहिए।

+1

किसी भी नियमित डीबगर का उपयोग करके, कॉल स्टैक बैकट्रैक को जांचना और यह पता लगाना आसान है कि यह विनाशक कौन कह रहा है। – Vargas

0

सी ++ एक नियम "एक परिभाषा नियम" कहा जाता है:

हर कार्यक्रम हर गैर इनलाइन समारोह या उद्देश्य यह है कि कि इस कार्यक्रम में प्रयोग किया जाता है के ठीक एक परिभाषा शामिल होगा; कोई निदान की आवश्यकता नहीं है। परिभाषा प्रोग्राम में स्पष्ट रूप से दिखाई दे सकती है, यह मानक या उपयोगकर्ता परिभाषित पुस्तकालय में पाया जा सकता है, या (जब उचित हो) इसे स्पष्ट रूप से परिभाषित किया गया है (12.1, 12.4 और 12.8 देखें)।

विकिपीडिया में article है जो इसे और अधिक विस्तार से बताता है।

आपने अपने प्रश्न में कोड पोस्ट नहीं किया है, इसलिए मैं आपके मामले के बारे में निश्चित नहीं हो सकता, लेकिन the question you linked to में, प्रश्न में उदाहरण दो साझा पुस्तकालयों में एक ही चर को परिभाषित कर रहा था। इसने "वन डेफिनिशन रूल" का उल्लंघन किया, जो स्पष्ट रूप से गतिशील लिंकर की अंतिम रूप रणनीति पर निर्भर करता है, जिससे विनाशक को दो बार बुलाया जाता है।

संबंधित मुद्दे