मैं बेहतर गति और डिबगिंग क्षमताओं के लिए 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));
}
हेलाइन को हटाने और कोड को हेडर के बजाय कार्यान्वयन फ़ाइल में डालने के लिए काम किया! मुझे आश्चर्य है कि जिस लिंक से मैंने कॉपी किया है, उसके बारे में कुछ भी उल्लेख नहीं किया गया है। – DSM