मैं किसी वर्ग के लिए सूचक है। चलो कहते हैं, उदाहरण के लिए, सूचक है:डिलीट होने पर सी ++ पॉइंटर को क्या लिखा जाता है यह निर्धारित करता है?
0x24083094
कि सूचक अंक के लिए:
0x03ac9184
कौन सा मेरी कक्षा का आभासी समारोह टेबल है। मेरे लिए उसका मतलब बनता है। विंडबग में, सब ठीक दिखता है।
मेरे द्वारा हटाए जाने सूचक कहा। अब 0x24083094
पर है:
0x604751f8
लेकिन यह कुछ यादृच्छिक कचरा, कि पता वहाँ हर बार में डाल दिया जाता है नहीं है, यह लगातार 0x604751f8
है! इतना है कि मैं वास्तव में उस पते का उपयोग यह निर्धारित करने के लिए कर सकता हूं कि क्या यह सूचक हटा दिया गया था, मेरे आवेदन के निष्पादन के बीच!
लेकिन क्यों? यह कैसे निर्धारित करता है कि 0x604751f8
वहां लिखा जाना चाहिए?
रिकॉर्ड के लिए, मैं खिड़कियों का उपयोग कर रहा, दृश्य स्टूडियो के तहत निर्माण 2003
मैं जानता हूँ कि मैं, कि मूल्य स्थापित किया जा रहा पर भरोसा नहीं कर सकते भले ही यह सुसंगत प्रतीत होता है, लेकिन मैं पर भरोसा कर सकते यह अलग है? अर्थात, और 0x03ac9184
0x24083094
पर नहीं हो सकता है अगर सूचक, हटा दी जाती है ना? वहां क्या रखा जाता है? यह कुछ भी हो सकता है, लेकिन 0x03ac9184
निश्चित रूप से वहां नहीं होगा (या फिर मैं अभी भी विधियों को कॉल कर सकता हूं, क्योंकि यह वर्चुअल फ़ंक्शन टेबल है)। क्या मैं सही हू?
मुझे लगता है कि मैं इस सवाल का जवाब है। हटाए जाने के बाद कुछ भी भरोसा नहीं कर सकता। शायद कुछ पृष्ठभूमि लोगों को यह देखने में मदद करेगी कि मैं कहां से आ रहा हूं। अनिवार्य रूप से, मैं एक बग को ठीक करने की कोशिश कर रहा हूं जहां मेरे नीचे से एक सूचक हटा दिया जाता है। यह एक लंबी कहानी है, मैं विवरण में नहीं जाऊंगा।
असल में, मैं पता लगाने के लिए कि मैं इस स्थिति में हूं कोशिश कर रहा हूँ, इसलिए मैं अपने समारोह से शान से बाहर निकल सकते हैं। मुझे लगता है कि सबसे आसान और सबसे अच्छा तरीका यह पता लगाने के लिए है कि वास्तव में इस सूचक का मालिक कौन है, और उससे पूछें कि क्या कुछ बदल गया है। तो मैं इस तरह एक फिक्स लागू करने जा रहा हूँ। यह किसी भी सी ++ को हैकर-वाई हटा देता है जिसे मैं चर्चा कर रहा था।
हालांकि, दिलचस्प बात यह है कि हमारे कोड में हम एक वर्ग 'BogusObject' कहा जाता है कि अनिवार्य रूप से एक ट्रे लोगों की है कि गलती से भिन्नता वस्तुओं मुक्त कर दिया पकड़ने के रूप में कार्य किया है। असल में, हम अपने स्वयं के डिलीट फ़ंक्शंस को हुक करते हैं और किसी भी मुक्त वर्ग के vtable में BogusObject क्लास को बाश करते हैं।
फिर अगर कोई कुछ कहता है तो उन्हें "हे, कुछ गलत दोस्त" के प्रभाव के बारे में कुछ कहने का एक अच्छा संदेश मिलता है। यह मेरे मामले में हो रहा है। I.e, 0x604751f8+(someoffset)
BogusObject क्लास के अंदर है। लेकिन अब हम BogusObject का उपयोग नहीं करते हैं! यह सचमुच कहीं भी स्थापित नहीं है (अगर मैं पूरी तरह से BogusObject क्लास को हटा देता हूं तो भी ठीक से लिंक करता है), और फिर भी मैं अच्छा संदेश प्राप्त कर रहा हूं कि कुछ गलत है! लेकिन अब मैं राय मान रहा हूं कि यह एक संयोग है।
कुछ कारणों से रनटाइम उस पॉइंटर में 0x604751f8
मान डाल रहा है, और यह उस वर्ग के अनुरूप होता है जिसका उद्देश्य इस तरह की स्थितियों को पकड़ने का उद्देश्य है!
आप अपने सूचक (0x24083094) पर डेटा ब्रेकपॉइंट क्यों सेट नहीं करते हैं और देखते हैं कि 0x604751f8 कब लिखा जाता है? जब डीबगर टूट जाता है, तो यह देखने के लिए स्टैक को क्रॉल करें कि आपको किसने बुलाया और कहां से आया था। –
हाँ मैंने ऐसा किया। यह MyModule से लौटने के बाद बदल जाता है! MyClass :: 'वेक्टर हटाने वाले विनाशक '। जब हटाया जाता है और जब यह बदलता है तो मैंने प्रत्येक पंक्ति में कदम रखा है। असल में, मेरे पास एक विंडबग लॉग है जो इसे दिखा रहा है, इसमें कुछ डीटी बदल रहे हैं। हालांकि, इसमें बहुत सारी कंपनी सामग्री है इसलिए मुझे साझा करने से पहले इसे साफ़ करने की आवश्यकता होगी। – pj4533