2012-09-21 15 views
7

हाय मैं एक लाइब्रेरी का उपयोग कर रहा हूं जिसने वैश्विक रूप से नए/हटाए गए ओवरराइड किए हैं। लेकिन मुझे इस पुस्तकालय में कोई समस्या है, समस्या यह है कि इसे मुख्य कार्य में मैन्युअल रूप से प्रारंभ करना होगा।वैश्विक रूप से ओवरराइड किए गए नए/अनदेखा

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

मैं वास्तव में डिफ़ॉल्ट मेमोरी मैनेजर का उपयोग करना चाहता हूं क्योंकि मैं इस पुस्तकालय में यूनिट परीक्षण जोड़ना चाहता हूं। यह मेरी यूनिट परीक्षण लाइब्रेरी द्वारा उपयोग की जाने वाली मेमोरी का उपयोग करने वाली मेमोरी का उपयोग करने के लिए ज्यादा समझ नहीं लेगा।

तो मेरा सवाल यह है कि यदि दूसरी लाइब्रेरी समेत वैश्विक ओवरराइड नए/हटाएं और केवल डिफ़ॉल्ट नया/हटाएं तो अनदेखा करना संभव है?

मैं मानक सी ++ कंपाइलर के साथ विंडोज 7 पर विजुअल स्टूडियो 2010 का उपयोग कर रहा हूं।

+0

जवाब मंच और/या संकलक पर निर्भर करेगा। – atzz

+0

क्या आप दोनों पुस्तकालयों को विकसित करते हैं या वे तीसरे पक्ष हैं? यदि आप मेमोरी मैनेजमेंट कोड के नियंत्रण में हैं, तो मैं 'std :: tr1 :: shared_ptr' की शैली में नया/डिलीट ओवरराइड करने और * मेमोरी मैनेजमेंट ऑब्जेक्ट * बनाने से विचलित हो जाऊंगा। – count0

+0

@ count0 हम मेमोरी मैनेजर लाइब्रेरी विकसित करते हैं। यह एक अत्यधिक अनुकूलित कचरा कलेक्टर के साथ एक कस्टम मेमोरी मैनेजर है। और मैं इकाई परीक्षण के लिए बढ़ावा परीक्षण पुस्तकालयों का उपयोग करने की कोशिश कर रहा हूं। – ProgrammerAtWork

उत्तर

0

क्या आप मेमोरी मैनेजर के प्रारंभिककरण को मुख्य रूप से साझा किए गए lib में डाल सकते हैं?

यदि यह संभव है तो आप प्रारंभिक क्रम अपने पुस्तकालयों (निर्भरता से) को किसी और लोड होने से पहले मेमोरी मैनेजर को लोड (और प्रारंभ) करने के लिए मजबूर करने का प्रयास कर सकते हैं। हालांकि यह एक बहुत ही भंगुर (या विशिष्ट) समाधान है क्योंकि यह उस क्रम को मजबूर करने के लिए मंच विशिष्ट कार्यवाही पर निर्भर करेगा जिसमें साझा libs प्रारंभ किए गए हैं।

+0

ओवरराइड कीवर्ड हेडर फ़ाइल में लिखे गए हैं, इसलिए मैं इसे वास्तव में किसी अन्य लाइब्रेरी में नहीं रख सकता, और मैं वास्तव में डिफ़ॉल्ट मेमोरी मैनेजर का उपयोग करना चाहता हूं क्योंकि मैं इस लाइब्रेरी में यूनिट परीक्षण जोड़ना चाहता हूं। यह मेरी यूनिट परीक्षण लाइब्रेरी द्वारा उपयोग की जाने वाली मेरी लाइब्रेरी का उपयोग करने वाली मेमोरी का उपयोग करने के लिए बहुत अधिक समझ नहीं लेगा। – ProgrammerAtWork

+0

ओह, निर्भरताओं के साथ प्रारंभिकरण के क्रम को मजबूर करना काम कर सकता है, मुझे नहीं पता ... लेकिन मैं अभी भी डिफ़ॉल्ट नया/डिलीट का उपयोग करना चाहता हूं, इसलिए मैं इकाई परीक्षणों को बिना किसी परीक्षण के यूनिट परीक्षण जोड़ सकता हूं यदि कोई शिकंजा कसना। – ProgrammerAtWork

+0

आपके प्रश्न से ऐसा लगता है कि स्मृति प्रबंधन शुरू होने से पहले आपको केवल :: नई और :: हटाने का उपयोग करने में समस्या थी। यदि आप दोनों का उपयोग करना चाहते हैं, तो आपको उस नए/डिलीट को स्पष्ट रूप से कॉल करना होगा जिसे आप परीक्षण करना चाहते हैं। यदि लाइब्रेरी डिज़ाइनर उस नामस्थान का उपयोग नहीं करते हैं तो आप परेशानी में पड़ सकते हैं, क्योंकि आप नहीं जानते कि वे अपनी लाइब्रेरी में आंतरिक रूप से किस विधि को कॉल करते हैं। – count0

0

अगर अधिभावी एक मैक्रो साथ किया जाता है आप

#pragma push_macro ("new") 
#undef new 
...code with standard new here ... 
#pragma pop_macro ("new") 

उपयोग कर सकते हैं तो आप अस्थायी रूप से एक 'नई' मैक्रो अपने आप को कहीं और रखे गए एक और नाम के साथ एक फ़ंक्शन को कॉल का निर्माण कर सकते हैं यह वास्तव में समारोह ओवरराइड द्वारा किया जाता है जो बस मानक समारोह कहते हैं। मैक्रोज़ फ़ंक्शन कॉल से पहले हल हो जाते हैं।

1

मुझे नहीं लगता कि लाइब्रेरी को संशोधित किए बिना यह संभव है। मुझे लगता है कि यह एक स्थिर पुस्तकालय के बारे में है (एक डीएल के अंदर, ओवरराइड न्यू/डिलीट को डीएलएल के अंदर के कार्यों द्वारा इंगित किया जाएगा।)

आप कमांड का उपयोग करके एक स्थिर लाइब्रेरी से ओबीजे फ़ाइल को हटा सकते हैं (विजुअल कमांड शीघ्र):

LIB /REMOVE:obj_to_remove /OUT:removed.lib input.lib 

पता लगाने के लिए दूर करने के लिए obj, पहली बार चलाने:

DUMPBIN /ARCHIVEMEMBERS input.lib 

आप इस तरह के

Archive member name at 14286: /0 compilation.dir\objfile1.obj 
के रूप में लाइनों देखेंगे 210

14286 ओबीजे फ़ाइल की पहचान करता है। यह देखने के लिए कि प्रत्येक प्रतीक कहां है, चलाएं:

DUMPBIN /LINKERMEMBER:1 input.lib > members.txt 

और नया/हटाएं देखें। members.txt में प्रत्येक प्रतीक के उलझन वाले नाम और ओबीजे के पहचानकर्ता शामिल होंगे जिसमें यह प्रतीक है। उदाहरण

14286 [email protected][email protected]@[email protected]@2HB 

14286 के लिए आप obj 'पहचानकर्ता' जिसमें प्रतीक है कह रहा है।आप नए ढूँढने परेशानी है, तो/हटाने के लिए, आप चला सकते हैं:

DUMPBIN /SYMBOLS input.lib > sym.txt 

जो sym.txt में प्रत्येक प्रतीक के लिए घायल और unmangled नाम फ्लश होगा।

अंत में, हमारे उदाहरण में compilation.dir\objfile1.obj द्वारा obj_to_remove की जगह ऊपर LIB कमांड के साथ obj फ़ाइल निकाल सकते हैं और removed.lib के खिलाफ कड़ी।

अब, यदि आप भाग्यशाली नहीं हैं, तो आपको आवश्यक अन्य प्रतीकों को एक ही ऑब्जेक्ट फ़ाइल में नया/हटाया जा सकता है। उस मामले में, आप "हैक" कर सकते हैं कुछ lib का उपयोग कर this की तरह (जैसे कि nelete को newdew करने और delete का नाम बदलने।)

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