मैं विंडोज़ में कुछ कोड पोर्ट कर रहा हूं और स्टंप हो गया हूं। कुछ कोड है जो पॉइंटर को पॉइंटर पर कॉपी करने के लिए स्वचालित रूप से लॉन्च पर चलता है, और पॉइंटर को पॉइंटर को हटाने के लिए बाहर निकलने पर फिर से चला जाता है यदि यह शून्य नहीं है।पॉइंटर-टू-पॉइंटर क्रैश होता है जहां पॉइंटर
मैं व्यवहार
int main()
{
// Pointer to a Pointer, current crash.
InterfaceClass** ptrptr;
ConcreteTwo* object = new ConcreteTwo();
ptrptr = (InterfaceClass**)(&object); // cast is required for some reason.
delete *ptrptr; // Crash here.
// Single pointer, works fine.
InterfaceClass* ptrptr;
ConcreteTwo* object = new ConcreteTwo();
ptrptr = object;
delete ptrptr;
// There are other cases where there are only 3 classes in the hierarchy.
// This also works fine.
InterfaceClass** ptrptr;
ConcreteOne* object = new ConcreteOne();
ptrptr = (InterfaceClass**)(&object);
delete *ptrptr;
return 0;
}
वर्ग पदानुक्रम इस तरह दिखता है पुन: पेश करने के लिए एक नमूना कार्यक्रम बनाया है। बेस क्लास कुछ शुद्ध आभासी कार्यों के साथ एक इंटरफ़ेस है और इस कार्यक्रम में कई कक्षाओं द्वारा इस तरह से शामिल किया गया है कि कई ऑब्जेक्ट्स संभावित रूप से इसे एक से अधिक स्थानों से प्राप्त करते हैं। इस वजह से ठोस कार्यान्वयन को इसे "सार्वजनिक वर्चुअल इंटरफेस क्लास" के साथ विस्तारित करना होगा। इस उदाहरण में "आभासी" को हटाने से दुर्घटना हल हो जाती है।
class InterfaceClass {
public:
virtual ~InterfaceClass() {};
InterfaceClass() {}
};
class ConcreteClass : public virtual InterfaceClass {
public:
ConcreteClass() { }
virtual ~ConcreteClass() {}
};
class ConcreteOne : public ConcreteClass
{
public:
ConcreteOne(void) {}
virtual ~ConcreteOne(void) {}
};
class ConcreteTwo : public ConcreteOne
{
public:
ConcreteTwo(void) {}
virtual ~ConcreteTwo(void) {}
};