नए

2011-02-14 18 views
6

के साथ मैक्रो विवादों के साथ नया स्थान बदल रहा है मेरे पास एक विशाल आवेदन (कई मिलियन एलओसी, और हजारों फाइलें) हैं, और मैं मेमोरी लीक का पता लगाने के लिए डीबग सीआरटी का उपयोग करने की कोशिश कर रहा हूं। मैं कोशिश कर रहा हूँ तो जैसे नए वृहद ize:नए

#define _CRTDBG_MAP_ALLOC 
#include <crtdbg.h> 
#ifndef NEW_DEBUG 
#define NEW_DEBUG new(_NORMAL_BLOCK, __FILE__, __LINE__) 
#define new NEW_DEBUG 
#endif 

अब, मेरे ऐप, इतना बड़ा है, इसलिए मेरे लिए, आदर्श, मुझे लगता है कि डाल एक हेडर फाइल में और विशेष रूप से शामिल है कि हजारों की संख्या में में सीपीपी फाइलें एक मजेदार काम नहीं है। इसलिए मैंने इसे हमारे एसडीके में एक सामान्य हेडर फ़ाइल में रखने का प्रयास किया है, जो प्रत्येक अनुवाद इकाई में शामिल होगा।

जिस समस्या में मैं दौड़ रहा हूं वह ऐसा लगता है कि कुछ एसटीएल हेडर फाइलों के साथ संघर्ष करना प्रतीत होता है, और जब प्लेसमेंट का उपयोग किया जाता है तो संकलक त्रुटियों को उत्सर्जित करता है। मैं इसे अपने स्वयं के कोड में बदल सकता हूं, प्रगमा का उपयोग करके और नए मैक्रो को अक्षम कर सकता हूं। वहां कोई समस्या नहीं है। यह एसटीएल हेडर फाइलें हैं जो प्लेसमेंट का उपयोग करती हैं, मैं नहीं बदल सकता।

मैंने कार्य-आसपास को पुन: व्यवस्थित करके सीपीपी फ़ाइलों में निर्देश शामिल किए हैं। उदाहरण के लिए:

// doesn't compile 
#include "new_redirect.h" 
#include <map> // for instance 

// does compile 
#include <map> // for instance 
#include "new_redirect.h" 

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

तो मेरी प्रश्न हैं:

  1. किसी को भी करने में सक्षम हो गया है स्थूल ize कोड की भारी मात्रा में झूल बिना नई पूरी तरह से? (अपेक्षाकृत दर्द रहित तरीके से)
  2. मेरे एसटीएल हेडर को पुन: व्यवस्थित करने के लिए कोई अन्य तरीका निर्देश शामिल हैं?

धन्यवाद

+0

इस सवाल देखा http://stackoverflow.com/questions/4301505/compile- पारित त्रुटियों-कब-मैं-उपयोग-सीआरटी-मेमोरी-लीक-डिटेक्शन? – sharptooth

+0

नहीं, मैंने नहीं किया है, लेकिन इसे पढ़ने के बाद, यह इस उपयोग के मेरी उम्मीदों के ताबूत में नाखून की तरह लगता है ... –

+0

'नया' को फिर से परिभाषित करना एक बुरा विचार है (टीएम)। यह भी देखें [http://stackoverflow.com/questions/3202520/) और [यहां] (http://stackoverflow.com/questions/1326656/)। –

उत्तर

3

आप एक variadic मैक्रो के साथ प्लेसमेंट नई पकड़ कर सकते हैं:


#define NEW_DEBUG(...) NEW_DEBUG2(_NORMAL_BLOCK, __FILE__, __LINE__, __VA_ARGS__) 
#define new NEW_DEBUG 

लेकिन पूर्वप्रक्रमक दोनों तर्क के साथ और बिना किसी मैक्रो, और एक मैक्रो को परिभाषित करने की अनुमति के लिए प्रतीत नहीं होता बिना तर्क के पहले लागू किया गया है, इसलिए मुझे एक प्रीप्रोसेसर पास के साथ ऐसा करने का कोई तरीका नहीं मिला। लेकिन यह दो के साथ संभव लगता है कि अगर हम पहले चलाने के ऊपर मैक्रो और/ई के साथ दे देते हैं, तो दूसरी साथ


#define NEW_DEBUG new(_NORMAL_BLOCK, __FILE__, __LINE__) 
#define NEW_DEBUG2(...) new(__VA_ARGS__) 
+0

उत्कृष्ट उत्तर के लिए धन्यवाद। मुझे लगता है कि हम केवल एक कंपाइलर के लिए आशा कर सकते हैं जो दो पास करता है .... प्रतीक्षा करें, मुझे एक प्रोग्रामिंग भाषा चाहिए जो एक का उपयोग न करे। आह क्या गड़बड़ है। –

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