2014-08-31 4 views
6

मैं बेहतर गति और डिबगिंग क्षमताओं के लिए C++ में मेमोरी पूल के बारे में जानने की कोशिश कर रहा हूं। मैं यहां मिले दृष्टिकोण का पालन कर रहा हूं: http://oroboro.com/overloading-operator-new/। इसलिए मैं new, new[], delete, और delete[] अतिभारित किया है इस तरह:ग्लोबल अधिभार हटाएं [] को तीसरे पक्ष के पुस्तकालयों में नहीं बुलाया जाता है

inline void* operator new  (size_t size) { return myAlloc(size); } 
inline void* operator new[] (size_t size) { return myAlloc(size); } 
inline void operator delete (void* ptr ) { myFree(ptr); } 
inline void operator delete[](void* ptr ) { myFree(ptr); } 

मुझे पसंद है कि तीसरे पक्ष के पुस्तकालयों new के इस संस्करण के लिए निर्देशित कर रहे हैं, लेकिन मैं कोई समस्या हुई थी। मैं DirectX एप्लिकेशन बना रहा हूं जो DXUT का उपयोग करता है। मैं अपनी परियोजना से अलग से DXUT संकलित करता हूं। अंततः यह कहता है:

std::unique_ptr<D3D11_SUBRESOURCE_DATA[]> initData(new (std::nothrow) D3D11_SUBRESOURCE_DATA[ mipCount * arraySize ]); 

एक बार इस अनूठी सूचक क्षेत्र से बाहर चला जाता है, यह delete[] _Ptr के लिए एक कॉल, जो मेरे अतिभारित ऑपरेटर के माध्यम से जाना नहीं था पर दुर्घटनाओं। मैंने अपने main में int* dummy = new int[10]; delete[] dummy; जोड़ कर अपने मेमोरी पूल कार्यान्वयन को डीबग करने का प्रयास किया। परियोजना के निर्माण में एक त्रुटि हुई, लेकिन साफ-सफाई ने ठीक काम किया। मेरे आश्चर्य के लिए, सबकुछ काम करता था, जिसमें डीएक्सयूटी लाइन भी दुर्घटनाग्रस्त हो रही थी!

प्रश्न 1: जब मैंने समस्या को हल करने वाले डीबगिंग लाइन को जोड़ा तो वास्तव में क्या हुआ? मुझे लगता है कि मेरे ऑपरेटर को हटाने के किसी कारण से [] तब तक ज्ञात नहीं था जब तक कि मैंने इसे अपने स्वयं के एप्लिकेशन कोड में नहीं बुलाया? क्या यह समस्या को ठीक करने की गारंटी है या यह सिर्फ गूंगा भाग्य है?

प्रश्न 2: मैंने देखा है कि new (std::nothrow) D3D11_SUBRESOURCE_DATA[ mipCount * arraySize ] ने मेरे operator new[] को सीधे कॉल नहीं किया, लेकिन अंत में मेरा operator new (कोई ब्रैकेट) नहीं कहा गया। यह अभी भी सूचक पर delete[] ऑपरेटर को कॉल करता है। क्या यह एक मुद्दा है? क्या मुझे उपयुक्त ओवरलोड जोड़ना है जैसे कि operator new[] कहलाता है या यह व्यवहार ठीक है?

संदर्भ के लिए, operator new[] अधिभार कि बुलाया गया था था:

void * __CRTDECL operator new[](::size_t count, const std::nothrow_t& x) 
_THROW0() 
{ // Try to allocate count bytes for an array 
    return (operator new(count, x)); 
} 

उत्तर

4

प्रश्न 1: वास्तव में क्या हुआ जब मैं डिबगिंग लाइन कहा कि समस्या का समाधान हो? मुझे लगता है कि मेरे ऑपरेटर को हटाए जाने के कारण किसी कारण से [] ज्ञात नहीं था जब तक कि मैंने इसे अपने स्वयं के एप्लिकेशन कोड में नहीं बुलाया? क्या यह समस्या को ठीक करने के लिए की गारंटी है या यह सिर्फ गूंगा भाग्य है?

§3.2 [basic.def.odr]/p4:

एक इनलाइन समारोह हर अनुवाद इकाई है जो में यह ओडीआर से इस्तेमाल किया है के रूप में परिभाषित किया जाएगा।

ऐसा लगता है कि आपके संकलक वैश्विक operator delete[] के लिए कोड के बाद से यह अपने मुख्य अनुवाद इकाई में इस्तेमाल नहीं कर रहा है और inline (जिसका अर्थ है कि संकलक मान सकते हैं चिह्नित है जनरेट नहीं किया था लगता है कि किसी भी अनुवाद इकाई का उपयोग करता है उन्हें एक होगा उनकी परिभाषा)। हालांकि, आपकी अलग-अलग संकलित लाइब्रेरी में उन कार्यों की परिभाषा नहीं है, और आप मानक लाइब्रेरी से डिफ़ॉल्ट का उपयोग कर समाप्त करते हैं। उन्हें गैर-inline बनाना समस्या को ठीक करना चाहिए।

प्रश्न 2: मैंने देखा है कि new (std::nothrow) D3D11_SUBRESOURCE_DATA[ mipCount * arraySize ] मेरी operator new[] सीधे, लेकिन अंत में कहा जाता है मेरी operator new (कोई कोष्ठक) फोन नहीं किया।यह अभी भी सूचक पर delete[] ऑपरेटर को कॉल करता है। क्या यह कोई समस्या है? क्या मुझे उपयुक्त ओवरलोड जैसे जोड़ना है कि मेरा operator new[] कहलाता है या यह व्यवहार ठीक है?

दोनों फेंकने और operator new [] के संस्करण है, साथ ही operator new की nonthrowing संस्करण nonthrowing के डिफ़ॉल्ट संस्करण, स्मृति प्राप्त करने के लिए operator new की फेंकने संस्करण कॉल करने के लिए निर्दिष्ट कर रहे हैं। तो आप वहां सुरक्षित हैं। हालांकि, आपकी operator new की परिभाषाएं गलत हैं। उन्हें एक वैध सूचक वापस करना होगा या अपवाद फेंकना होगा। एक शून्य सूचक वापस लौटने की अनुमति नहीं है।

+0

हेलाइन को हटाने और कोड को हेडर के बजाय कार्यान्वयन फ़ाइल में डालने के लिए काम किया! मुझे आश्चर्य है कि जिस लिंक से मैंने कॉपी किया है, उसके बारे में कुछ भी उल्लेख नहीं किया गया है। – DSM

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

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