c - सी रनटाइम के स्टेटिक vs डायनेमिक लिंकिंग में मेमोरी आवंटन




visual-c++ dynamic-linking (2)

मेरे कार्यक्रम की वास्तुकला में प्लगइन्स (डीएलएल) और एक्सई (स्पष्ट रूप से) शामिल है हम केवल प्लग इन प्रदाता हैं मुझे बताया गया था कि एक प्लगइन में मेमोरी आवंटित करने और फिर इसे एक्सई कोड में मुक्त करना एक संभावित समस्या थी अगर हम स्थिर रूप से सी रनटाइम से जुड़ा हुआ हो। हालांकि, अगर हम इसे गतिशील रूप से लिंक करते हैं, तो सिर्फ एक ही ढेर हो गया था और सी रनटाइम के पास यह सब कुछ था। हमने इस सलाह के आधार पर गतिशील लिंकिंग के लिए स्विच किया है, लेकिन हम जो भी स्विच से देख चुके हैं वह सिरदर्द है और नए रनटाइम्स के वितरण और स्थापना से संबंधित परेशानी है। (हम स्मृति आवंटन समस्याओं के संदर्भ में क्या नहीं टालते हैं ।)

स्मृति आवंटन के निहितार्थ क्या हैं? कहो एक प्लगइन स्मृति आवंटित करता है और exe इसे मुक्त करता है स्थिर बनाम गतिशील लिंक किए गए सी रनटाइम के बीच क्या कोई भिन्न व्यवहार होता है? यदि हम प्लगइन्स का उपयोग करते हैं तो क्या हम सी रनटाइम को जोड़कर परेशान करेंगे? अगर हम वापस स्थिर जोड़ने के लिए स्विच करते हैं, तो क्या यह गलती स्मृति रिसाव का पता लगाने और क्रैश डंप रिपोर्टिंग करेगा?

क्या मुझे कोई वीसी ++ रनटाइम संस्करण चुनने पर टिप्पणी द्वारा उठाए गए कुछ प्रश्नों के अनुरूप है- स्थिर या गतिशील? विशेष रूप से कौन सी वीसी ++ रनटाइम संस्करण मैं चुनता हूं - स्थिर या गतिशील?

Http://msdn.microsoft.com/en-us/library/abx4dbyh(v=VS.100).aspx पर कुछ चर्चा भी है।


आवंटन के लिए कार्य / मुक्त मेमोरी बनती है; आप my_malloc () को कॉल नहीं कर सकते हैं और फिर कुछ यादृच्छिक लाइब्रेरी से निःशुल्क () का उपयोग कर सकते हैं, या C ++ का "नया" ऑपरेटर कॉल कर सकते हैं और बाद में फ्रीमम () को कॉल कर सकते हैं :)

आपके प्लगइन को स्मृति आवंटित करने और मुक्त करने का एक प्रसिद्ध तरीका होना चाहिए। यदि यह malloc () करता है, तो आपका मुख्य प्रोग्राम शायद निशुल्क () कर सकता है लेकिन अगर यह कुछ और विदेशी (विंडोज़ मेमोरी आवंटन उपलब्ध है) है, तो आपकी प्लगइन एपीआई को अपने एक्सटी को अपने डेटा को खाली करने के लिए प्लगइन में कॉल करने के लिए एक रास्ता प्रदान करना होगा।

तो अगर youur मुख्य कार्यक्रम कॉल

foo = plugin->allocate_something()

तो यह आपके प्लगइन एपीआई के लिए इसी के अनुरूप होगा

plugin->free_something (foo)

कि मुख्य कार्यक्रम unambiguously उपयोग कर सकते हैं


जाहिर है, समस्या यह है कि प्लग-इन और मुख्य ऐप अलग-अलग और असंगत ढेर प्रबंधकों का उपयोग करते हैं जो एक दूसरे के डेटा संरचना को ढंकते हैं। डायनेमिक सीआरटी का उपयोग सैद्धांतिक रूप से एक ही सीआरटी का उपयोग करने के लिए दोनों को मजबूर करता है और इसलिए दोनों ही संगत हैं।

सामान्य मामले में, यह सबसे अच्छा हो सकता है कि प्लग-इन इन सभी मेमोरी को इस्तेमाल करने और हटाने में दोनों को जिम्मेदार ठहराए। इसका मतलब यह है कि पहले से बनाए गए ऑब्जेक्ट को हटाने के लिए प्लग-इन में एपीआई जोड़ना और मुख्य एप्लिकेशन पर वापस भेज दिया गया। यह प्लग-इन और ऐप के बीच अच्छा अलगाव भी प्रदान करता है, जो प्लग-इन को प्रदर्शन या अन्य कारणों के लिए विशेष आबंटन का उपयोग करने की इजाजत देता है। उदाहरण के लिए, COM क्या करता है।





msvcrt