क्यों की 0x0C
तुलना में अधिक सामान्य लगता है 0x08
(क्या यह वास्तव में है? मुझे नहीं पता; और किस प्रकार के अनुप्रयोगों में?), यह वर्चुअल विधि तालिका पॉइंटर्स के साथ करना पड़ सकता है। यह वास्तव में एक टिप्पणी के अधिक है (जंगली द्रव्यमान का अनुमान लगाने वाला :), लेकिन यह कुछ हद तक बड़ा है, इसलिए यहां जाता है ... यदि आपको आभासी विधियों के साथ एक वर्ग मिला है, तो इसके अपने क्षेत्रों को स्थानांतरित किया जाएगा 0x04
। उदाहरण के लिए, एक वर्ग जो दूसरे आभासी वर्ग से विरासत में मिला है, उसके पास इस तरह का मेमोरी लेआउट हो सकता है:
0x00 - VMT pointer for parent
0x04 - Field 1 in parent
0x08 - VMT pointer for child
0x0C - Field 1 in child
क्या यह एक सामान्य परिदृश्य है, या करीब भी है? मुझे यकीन नहीं है। हालाँकि, ध्यान दें कि 64-बिट अनुप्रयोग में, यह और भी दिलचस्प रूप से 0x0C
मूल्य की ओर स्थानांतरित हो सकता है :
0x00 - VMT parent
0x08 - Field 1 parent
0x0C - VMT child
0x14 - Field 2 child
इसलिए वास्तव में बहुत सारे मामले हैं जहां अनुप्रयोगों में अशक्त-सूचक ऑफसेट में महत्वपूर्ण ओवरलैप हो सकते हैं। यह चाइल्ड क्लास में पहला फील्ड हो सकता है, या इसके वर्चुअल मेथड टेबल पॉइंटर - जब भी आप किसी इंस्टेंस पर किसी वर्चुअल तरीके को कॉल करते हैं, तो यदि आप किसी null
पॉइंटर पर वर्चुअल मेथड को कॉल कर रहे हैं , तो आपको इस पर एक्सेस का उल्लंघन होगा। VMT ऑफसेट। इस विशेष मूल्य की व्यापकता तब कुछ सामान्य एपीआई के साथ कुछ हो सकती है जो एक वर्ग प्रदान करती है जिसमें एक समान विरासत पैटर्न, या अधिक संभावना है, एक विशेष इंटरफ़ेस (कुछ वर्गों के लिए बहुत संभव है, जैसे डायरेक्टएक्स गेम्स)। इस तरह से कुछ सामान्य सामान्य कारणों को ट्रैक करना संभव हो सकता है, लेकिन मैं उन अनुप्रयोगों से छुटकारा पाने की कोशिश करता हूं जो बहुत जल्दी से डेरेफेरिंग करते हैं, इसलिए ...
0000000C
है जिस तरह से अधिक आम00000008
है, लेकिन जवाब में से कोई भी पता लगता है कि सभी पर: /