मैं जानना चाहता हूं कि डिलीट ऑपरेटर मेमोरी लोकेशन को कैसे हटाता है जिसे ऑब्जेक्ट के वास्तविक स्मृति स्थान से अलग बेस क्लास पॉइंटर दिया जाता है, जिसे मुक्त किया जाना चाहिए।सी ++ डिलीट ऑपरेटर को पॉलिमॉर्फिक ऑब्जेक्ट का मेमोरी लोकेशन कैसे मिलता है?
मैं इस व्यवहार को अपने स्वयं के कस्टम आवंटक/डेलोकेटर में डुप्लिकेट करना चाहता हूं।
निम्न पदानुक्रम पर विचार करें:
struct A
{
unsigned a;
virtual ~A() { }
};
struct B
{
unsigned b;
virtual ~B() { }
};
struct C : public A, public B
{
unsigned c;
};
मैं प्रकार सी की एक वस्तु का आवंटन और के रूप में मैं बता सकता है इस ऑपरेटर का एक मान्य उपयोग हटाना है जहां तक प्रकार बी के एक सूचक के माध्यम से इसे नष्ट करना चाहते, और यह लिनक्स/जीसीसी के तहत काम करता है:
C* c = new C;
B* b = c;
delete b;
दिलचस्प बात यह है कि संकेत 'बी' और 'सी' वास्तव में की वजह से अलग-अलग पतों कैसे वस्तु स्मृति में खर्च की गई थी, और नष्ट ऑपरेटर "को इंगित है जानता है "सही मेमोरी स्थान कैसे ढूंढें और कैसे मुक्त करें।
मुझे पता है कि, सामान्य रूप से, बेस क्लास पॉइंटर: Find out the size of a polymorphic object दिए गए पॉलीमोर्फिक ऑब्जेक्ट का आकार ढूंढना संभव नहीं है। मुझे संदेह है कि वस्तु के वास्तविक स्मृति स्थान को ढूंढना आम तौर पर संभव नहीं है।
नोट्स:
- मेरे सवाल यह है कि नई [] और [] हटाने के काम से संबंधित नहीं है। मुझे एक ऑब्जेक्ट आवंटन मामले में रूचि है। How does delete[] "know" the size of the operand array?।
- मुझे इस बारे में कोई चिंता नहीं है कि विनाशक को या तो कैसे कहा जाता है। मुझे स्मृति की गिरावट में दिलचस्पी है। How 'delete' works when I delete a pointer of base class
- मैंने -फनो-आरटीआई और -फनो-अपवादों का उपयोग करके परीक्षण किया, इसलिए G ++ को रनटाइम प्रकार की जानकारी तक पहुंच नहीं होनी चाहिए।
संक्षिप्त उत्तर: मानक के अलावा यह कार्यान्वयन परिभाषित किया गया है कि एक अनुरूप कंपेलर को इसका समर्थन करना चाहिए। मेरा अनुमान है कि, हालांकि, जी ++ आंतरिक विनाश तर्क के कुछ हिस्से में कूदने के लिए vtable का उपयोग करता है जो ठीक से काम करेगा। –
हालांकि कुछ कार्यान्वयन देखना दिलचस्प होगा। (सी में 'मॉलोक/फ्री' सी समान है, और मुझे विश्वास है कि दृष्टिकोण पर 'मॉलोक' से लौटने वाले पॉइंटर को "स्पेस" से पहले कुछ जगह आरक्षित करना है।) –
हालांकि, मुझे 'बी नहीं मिलता है! = सी' .. अलग-अलग चर हैं लेकिन एक ही ऑब्जेक्ट (मेमोरी) दोनों "बिंदु", नहीं? (मैं सी ++ का उपयोग नहीं करता, इसलिए जादू मुझ पर खो गया है)। –