2011-01-10 5 views
5

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

धन्यवाद

मूल रूप से वहाँ एक रास्ता है, जहां कोई भी आवंटित यह सिर्फ addEvent(new DerivedEvent(), FunctorDestroyClass());

+0

नहीं। यही कारण है कि आप रनटाइम के खिलाफ गतिशील रूप से लिंक करते हैं। यह मानक व्यवहार (गतिशील लिंकिंग) है और एमएस द्वारा अनुशंसित एकमात्र तरीका है। रनटाइम को स्थिर रूप से जोड़ने से सिरदर्द हो जाता है। बस यह मत करो। –

उत्तर

2

मैं अपने प्रश्न से वहाँ में और अधिक पढ़ सकते हैं, लेकिन आप को पता है आप कैसे आवंटित और DLL सीमाओं के पार मुक्त स्मृति कर सकते हैं चाहते हैं, तो आप निम्न की तरह कुछ का उपयोग हो सकता है:

#define DLLMemAlloc(size) HeapAlloc(GetProcessHeap(), 0, size) 
#define DLLMemFree(mem) HeapFree(GetProcessHeap(), 0, mem) 

यह सुरक्षित हो सकता है (भावी-प्रमाणन पर आंशिक प्रयास)। सीमाओं को आवंटित करने और मुक्त करने की सुरक्षा की गारंटी के लिए विभिन्न निर्माण विकल्पों पर निर्भर होने से समस्याएं पैदा हो सकती हैं।

और (प्रश्न का हिस्सा भी नहीं), तो आप फिर से सोच सकते हैं कि यह करने में सक्षम होना वास्तव में आवश्यक है या नहीं। ऐसा लगता है कि एक डिज़ाइन दोष हो सकता है यदि एक डीएलएल को किसी अन्य डीएलएल (या निष्पादन योग्य) को आवंटित करना है।

+0

ऐसा इसलिए है क्योंकि मैं पॉलिमॉर्फिक समय की घटनाओं को करना चाहता हूं, इसलिए ऐसा करने के लिए कोई कारखाना तरीका नहीं है, और यदि उपयोगकर्ता के पास समय का ट्रैक रखने का कोई तरीका नहीं है, तो उन्हें यह नहीं पता होगा कि इसे कब मुक्त किया जाए, यही कारण है कि डीएलएल को भी इसकी आवश्यकता है। – jmasterx

+1

मैं सहमत हूं। मुझे नहीं लगता कि आप एक तरफ आवंटित कर सकते हैं और दूसरे पर मुक्त हो सकते हैं और रात में अच्छी तरह सो सकते हैं, भले ही यह ठीक काम करता है, यह एक दिन में आपको गधे में काट देगा। –

+0

@ मिलो डीएलएल एक क्लीनअप इंटरफ़ेस का पर्दाफाश कर सकता है और EXE केवल एक निःशुल्क() कॉल का उपयोग करने के बजाय इसे निःशुल्क उपयोग कर सकता है। –

0

कर सकता है यदि आप रन-टाइम पुस्तकालय स्थिर लिंक DLL यह है खुद स्मृति प्रबंधक मिल जाएगा है। आपके पास 3 विकल्प हैं: लिंक रन-टाइम गतिशील रूप से, हमेशा एक ही स्थान पर आवंटित और स्थानांतरित करें (या तो डीएलएल या निष्पादन योग्य, यदि आवश्यक हो तो अग्रेषण प्रदान करें), या इस समस्या का ख्याल रखने वाले तृतीय पक्ष मेमोरी आवंटक का उपयोग करें।

+0

तो यदि डीएलएल गतिशील रूप से MSVCR80.DLL के रनटाइम से लिंक करता है, तो exe को MSVCRT90.DLL गतिशील रूप से लिंक करता है, कोई समस्या नहीं है? – jmasterx

+0

निश्चित रूप से यह है कि यदि वे एक ही संस्करण नहीं हैं। आपको एक ही ढेर रखने के लिए दो मॉड्यूल पर भरोसा नहीं करना चाहिए। – Puppy

+1

@ मिलो कोई समस्या नहीं होनी चाहिए जबतक कि आप एक तरफ आवंटित करने की कोशिश नहीं करते हैं और दूसरे पर मुक्त होते हैं, लेकिन मैंने इसे स्वयं (टीएम) की कोशिश नहीं की है। –

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