c++ नई के साथ व्युत्पन्न कक्षा सरणी आवंटित करने की समस्या




segmentation-fault new-operator (3)

मेरे पास एक साधारण प्रोग्राम है

$ cat a.cpp 
#include <iostream>
class MyClass {
    public:
        virtual void check() {
            std::cout << "Inside MyClass\n";
        }
};

class MyClass2: public MyClass {
    public:
        int* a;
        virtual void check() {
            std::cout << "Inside MyClass2\n";
        }
};

int main() {
    MyClass *w, *v;
    w = new MyClass2[2];
    v = new MyClass2;
    std::cout << "Calling w[0].check\n"; w[0].check();
    std::cout << "Calling v->check\n"; v->check();
    std::cout << "Calling w[1].check\n"; w[1].check();
}
$ g++ a.cpp
$ ./a.out 
Calling w[0].check
Inside MyClass2
Calling v->check
Inside MyClass2
Calling w[1].check
Segmentation fault

मैंने सोचा कि व्युत्पन्न क्लास ऑब्जेक्ट को आवंटित करने के लिए नए का उपयोग करना संभव है। इसके अलावा, v-> जांच () ठीक काम करने लगता है


@ जेम्स मैकनेलिस और @ नवाज के प्रस्तावित समाधान (जो सही हैं) के एक विस्तार के रूप में, आप कंटेनर वर्गों का उपयोग करके बहुत से भ्रम से बच सकते हैं जिन्हें आप और स्मार्ट पॉइंटर्स के लिए उपलब्ध हैं अर्थात् std::vector और std::array (आपके कंपाइलर संस्करण के आधार पर, यह tr1 नामस्थान में हो सकता है या आपको इसका उपयोग करने के लिए बढ़ावा पुस्तकालय डाउनलोड करने की आवश्यकता हो सकती है) और shared_ptr (ऐसे अन्य लोग भी हैं जिन्हें आप चुन सकते हैं, हालांकि)।


w = new MyClass2[2]; 

यह दो MyClass2 वस्तुओं की एक सरणी बनाता है यह प्रकार MyClass2[2] नई अभिव्यक्ति इस सरणी के प्रारंभिक तत्व में एक संकेतक देता है और आप उस सूचक को w लिए निर्दिष्ट करते हैं।

w[1].check();  

यह MyClass ऑब्जेक्ट की एक सरणी के लिए पॉइंटर के रूप में मानता है, कि MyClass2 ऑब्जेक्ट की एक सरणी के रूप में।

आप व्युत्पन्न क्लास ऑब्जेक्ट की एक सरणी का इलाज नहीं कर सकते, जैसे कि यह बेस क्लास ऑब्जेक्ट्स की एक सरणी थी। यदि आप व्युत्पन्न श्रेणी के ऑब्जेक्ट का उपयोग करने में सक्षम होना चाहते हैं, तो आपको पॉइंटर्स के सरणी की आवश्यकता है:

MyClass** w = new MyClass*[2];
w[0] = new MyClass2;
w[1] = new MyClass2;

चूंकि जेम्स गायब होने लगता है, मुझे लगता है कि मुझे सही समाधान पोस्ट करना चाहिए:

MyClass** w = new MyClass*[2]; //Note the difference from James solution!
w[0] = new MyClass2;
w[1] = new MyClass2;

std::cout << "Calling w[0].check\n"; w[0].check();
std::cout << "Calling w[1].check\n"; w[1].check();

यह काम करना चाहिए!







dynamic-memory-allocation