2011-11-18 6 views
47

सबसे पहले, SO पर समान विषय वाले कम से कम 4-5 विषय थे। मैंने उनमें से प्रत्येक को पढ़ा और मुझे नहीं लगता कि वे वास्तव में इस विशिष्ट मुद्दे के साथ मेरी मदद करते हैं। अगर किसी और को एक डुप्लिकेट प्रश्न मिलता है तो मैं क्षमा चाहता हूं। मैंने इसे पोस्ट करने से पहले खोज का अपना हिस्सा किया है, क्योंकि यह एक बहुत ही आम प्रश्न की तरह लगता है।ग्लोबल न्यू को सही तरीके से कैसे बदलें और ऑपरेटरों को हटाएं

मैं Windows 7.

पर विजुअल स्टूडियो .NET 2003 का उपयोग कर रहा मैं अपने स्वयं के कस्टम करने के लिए नए/उस बिंदु को नष्ट की अपने ही भार के निदान के लिए है malloc() और() करने के लिए कहता है। मेरा नया/हटा ओवरलोड एक हेडर फ़ाइल में है जिसे मैंने कुछ फाइलों में शामिल किया है।

समस्या यह है कि कोड बेस बहुत अधिक स्पेगेटी है और यह सुनिश्चित करने का कोई आसान तरीका नहीं है कि इन अधिभारों का उपयोग सबकुछ से किया जाए। ब्लैक-बॉक्स वाले तृतीय पक्ष पुस्तकालयों में शामिल हैं। हम हर जगह एसटीएल का भी उपयोग करते हैं।

मेरे परीक्षणों में मैंने पाया है कि एसटीएल अभी भी अपने स्वयं के नए/हटाए गए कॉल और मानक एमएसवीसी नई/हटाएं कॉल पर कॉल कर रहा है।

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

+0

आप एक पूर्व संकलित हैडर कि ज्यादातर जमीन को कवर करना चाहिए में विश्व स्तर पर ऑपरेटरों को परिभाषित करते हैं। वैकल्पिक रूप से आप सीआरटी ढेर कार्यों का उपयोग कर सकते हैं यदि यह स्मृति रिसाव का पता लगाने के लिए है। – AJG85

उत्तर

63

ऐसा नहीं है कि यह कैसे काम करता है। आप दो ऑपरेटरों को प्रतिस्थापित करते हैं, और यह लिंक समय पर किया जाता है। आपको बस एक ही टीयू लिखना है कि इन ऑपरेटरों को परिभाषित करता है और इसे मिश्रण में जोड़ता है। बाकी किसी ने कभी इस बारे में पता करने की जरूरत है:

// optional_ops.cpp 

void * operator new(std::size_t n) throw(std::bad_alloc) 
{ 
    //... 
} 
void operator delete(void * p) throw() 
{ 
    //... 
} 

सिद्धांत रूप में, वहाँ, किसी भी हेडर फाइल की कोई आवश्यकता नहीं इन कार्यों (operator new, operator delete) घोषित करने के लिए है, क्योंकि घोषणाओं उन दो कार्यों के पहले से ही में hardcoded कर रहे हैं भाषा, अगर आप करेंगे। हालांकि, नाम std, std::bad_alloc और std::size_t पूर्व निर्धारित नहीं हैं, इसलिए आप शायद उन नामों को प्रदान करने के लिए <new> या कुछ अन्य शीर्षलेख शामिल करना चाहेंगे।

सी ++ 11 और उससे आगे में, आप वैकल्पिक रूप सेका उपयोग कर सकते हैं ताकि पहले पैरामीटर का आकार किसी भी प्रकार की लाइब्रेरी की आवश्यकता न हो। सी ++ 11 में गतिशील अपवाद विनिर्देशों के बिना एक सरल अपवाद मॉडल भी है (जिसे अंत में पूरी तरह से सी ++ 17 में भाषा से निकाल दिया गया था)।

void * operator new(decltype(sizeof(0)) n) noexcept(false) 
{ 
    //... 
} 
+1

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

+3

@RobertDailey: मानक, कमजोर संदर्भ इत्यादि द्वारा कवर किया गया विशेष मामला, मैंने वास्तव में अन्य दिनों से संबंधित जीसीसी में एक बग की सूचना दी, इसलिए नवीनतम संस्करण के साथ इसे '-फहोल-प्रोग्राम' के साथ भी काम करना चाहिए और '-flto' और whatnot (देखें [यहां] (http://stackoverflow.com/questions/7629270/how-does-stdstring-allocate-memory-in-gcc-with-fwhole-program) और [यहां] (http : //gcc.gnu.org/bugzilla/show_bug.cgi आईडी = 50,594)।) ' –

+0

क्या आप" मानक द्वारा कवर "और" कमजोर संदर्भ "से क्या मतलब समझ सकते हैं? धन्यवाद!! –

31

इसके अलावा इन पंक्तियां जोड़ें:

void *operator new[](std::size_t s) throw(std::bad_alloc) 
{ 
    // TODO: implement 
    return NULL; 
} 
void operator delete[](void *p) throw() 
{ 
    // TODO: implement 
} 
संबंधित मुद्दे