new operator - C++ HEAP CORRUPTION DETECTED - CRT -
मेरे पास BYTE सरणी है, इस प्रकार है:
BYTE * m_pImage; M_pImage = नया BYTE [m_someLength]; और मेरे कार्यक्रम डेटा के विभिन्न चरणों में इस सरणी पर प्रतिलिपि बनाई जाती है जैसे:
BYTE * pDestinationBuffer = m_pImage + m_imageOffset; memcpy (pDestinationBuffer, (BYTE *) डेटा, डेटा लैंघ); लेकिन जब मैं अपना बफर हटाना चाहता हूं:
हटाएं [] m_pImage; मुझे हेप भ्रष्टता प्राप्त हो रही है - सीआरटी ने पता लगाया है कि अनुप्रयोग मेप बफर के अंत के बाद स्मृति में लिखा है अब मेरे पास है एक सरल कार्यक्रम के साथ प्रयोग करने के लिए त्रुटि की कोशिश और नकल करने के लिए मुझे क्या हो रहा है की जांच में मदद करने के लिए। मैं निम्नलिखित से देखता हूं कि यदि मैं आकार 5 की एक सरणी बना देता हूं, लेकिन इसे खत्म होने पर इसे लिखने की कोशिश करता हूं तो मुझे एक ही त्रुटि मिलती है।
int * myArray = new int [ 5]; मेरी ऐरे [0] = 0; मेरीअरे [1] = 1; मेरीअरे [2] = 2; मेरी ऐरे [3] = 3; मेरीअरे [4] = 4; मेरी ऐरे [5] = 5; // सरणी सीमा से परे लेखन [हटाएं] myArray; अब मेरा सवाल है कि मैं कैसे संभवतः डिबग कर सकता हूं या पता लगा सकता हूं कि मेरे मूल बफर को ओवरराइट करना क्या है। मुझे पता है कि बफर के अंत पर कुछ लिखा जा रहा है, इसलिए दृश्य स्टूडियो के लिए यह आसानी से मुझे डिबग करने में मदद करने का एक तरीका है।
डेटा बफर को कॉपी करने से ऊपर दिए गए कोड को कई बार कहा जाता है हटाने के लिए m_pImage सामग्री का ट्रैक रखने के लिए और उस पर प्रतिलिपि बनाए गए डेटा को कड़ी मेहनत से निकाला जा सकता है। (इसका लगभग 2 एम मूल्य का आंकड़ा)
अब मेरा सवाल है कि मैं कैसे संभवतः डिबग कर सकता हूं या मेरे मूल बफर को ओवरराइट करते हुए पता करें।
मैं जितना संभव हो सके जोर () कथन का उपयोग करने की सिफारिश करता हूं। इस मामले में यह होना चाहिए: BYTE * pDestinationBuffer = m_pImage + m_imageOffset; जोर दें (डेटा लैंग + m_imageOffset & lt; = m_someLength); memcpy (pDestinationBuffer, (BYTE *) डेटा, डेटा लैंघ); फिर डीबग मोड में संकलित करें और चलाएं। इस पद्धति का लाभ - आपको रिलीज़ मोड में कोई ओवरहेड नहीं होगा, जहां पर दावा नहीं किया जाता है।
Comments
Post a Comment