2012-10-10 12 views
6

माइक्रोसॉफ्ट रनटाइम लाइब्रेरी आवंटन कार्यों के डीबग संस्करण प्रदान करता है। सी के लिए ++ इस हस्ताक्षर के साथ नए ऑपरेटर के एक डिबग संस्करण है:प्लेसमेंट को नुकसान पहुंचाए बिना डीबग संस्करण के साथ नया ओवरराइड करना नया

void *operator new(size_t size, int blockType, const char *filename, int linenumber); 

और एक मैक्रो की तरह

#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) 

परिभाषित किया गया है अब साधन करने के लिए सभी आवंटन, एक सामान्य रूप से परिभाषित करता है

#if defined DEBUG_NEW 
#define new DEBUG_NEW 
#endif 

हालांकि यह परिभाषा किसी भी स्थान को तोड़ती है जो प्लेसमेंट का उपयोग करती है, क्योंकि तर्कों के दो सेट सिंटैक्स त्रुटि होने लगते हैं। अब मैं आसानी से हमारे कोड में कुछ उपयोगों को संभाल सकता हूं, लेकिन मानक लाइब्रेरी और बूस्ट यूज प्लेस प्लेस जगह पर नया है। तो परिभाषा से पहले बहुत सारी चीजों सहित इस वैश्विक स्तर को परिभाषित करना और संकलन धीमा करना।

तो क्या हमारे कोड में हेडर्स खींचने के बिना हमारे कोड में उपकरण आवंटन का कोई तरीका होगा क्योंकि उनमें प्लेसमेंट नया है और बिना किसी फाइल को ऊपर परिभाषित करने या DEBUG_NEW मैन्युअल रूप से लिखने के बिना?

उत्तर

0

इस पूरे DEBUG_NEW बात आग में मरने चाहिए! यह केवल कभी भी उपयोगी नहीं था और यह आधुनिक सी ++ में उपयोगी नहीं है, क्योंकि अब आप Sane C++ में new नहीं देखते हैं।

ड्यूमा जैसे बेहतर विकल्प थे और अब Dr. Memory (जो Valgrind, लेकिन विंडोज़ पर समान रूप से काम करता है), DEBUG_NEW घृणा का उपयोग करने में बिल्कुल कोई बात नहीं है।

3

(Stdafx.h, Pch.h, PreCompiled.h या जो कुछ भी) जिस तरह से मैं ऐतिहासिक दृष्टि से इस समाधान कर लिया है precompiled हेडर का उपयोग करके, और कुछ इस तरह करने से है:

//First include all headers using placement new 
#include <boost/tuple/tuple.hpp> 
#include <vector> 

#define new MY_NEW 
#define MY_NEW new(__FILE__, __LINE__) 

और फिर यह सुनिश्चित कर लें किसी भी फाइल में बूस्ट हेडर सीधे शामिल नहीं हैं बल्कि केवल प्रीकंपिल्ड हेडर शामिल हैं।

+0

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

+0

उन्हें किस तरह बनाए रखना मुश्किल होगा? पीएचसी बहुत बार बदलना चाहिए। –

+0

यदि इसमें बूस्ट सामान शामिल है, तो यह अक्सर बदल जाएगा। लेकिन शायद मुझे इस मेमोरी डीबग हेडर को प्रीकंपलिंग करने का प्रयास करना चाहिए (जिसे '/ Fi' कंपाइलर विकल्प से इंजेक्शन दिया जाता है); नियुक्ति नया बहुत कम स्थानों में दिखाई देता है। –

-1

define new DEBUG_NEW लाइन को सभी # शामिल पंक्तियों के बाद, स्रोत फ़ाइलों में रखा जाना चाहिए। इस तरह से यह केवल आपके कोड पर लागू होता है, और बूस्ट जैसी किसी भी अन्य एच-फाइलों पर लागू नहीं होता है। DEBUG_NEW पुनर्वितरण के लिए वैश्विक नया संकलन विफल हो सकता है और इससे बचा जाना चाहिए।

+0

आप सही हैं, सिवाय इसके कि, आप देखते हैं, प्रश्न स्पष्ट रूप से ** ** ऐसा करने के बिना था। –

+0

उत्तर पढ़ने के बिना मतदान का अच्छा उदाहरण। –

5
#pragma push_macro("new") 
#undef new 

new(pointer) my_class_t(arg1, arg2); 

#pragma pop_macro("new") 

या

#pragma push_macro("new") 
#undef new 

#include <...> 
#include <...> 
#include <...> 

#pragma pop_macro("new") 
+0

यह वर्णन करना सहायक होगा कि 'push_macro() 'और' pop_macro()' कार्य कैसे करें। जैसे, 'pop_macro ("new") 'के बाद मूल' नया 'बहाल हो जाता है। – cpburnz

0

मैं जानता हूँ कि इस की देर तरह है, लेकिन यह समस्या टेम्पलेट जादू का उपयोग करके हल किया जा सकता।

मैं हाल ही में एक डीबग_न्यू डीबगर कोडिंग कर रहा हूं, जो एक नया कीवर्ड "प्लेसमेंट" जोड़ता है, जो सभी प्लेसमेंट नई कॉल के सामने लिखा जाता है।

आप यहाँ मेरी डिबगर की जाँच कर सकते हैं: https://sourceforge.net/projects/debugnew/

या यहाँ nvwa से debug_new डिबगर: https://sourceforge.net/projects/nvwa/

+0

क्या आप स्पष्टीकरण शामिल कर सकते हैं कि यह कैसे और क्यों काम करता है? –

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