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




segmentation-fault new-operator (2)

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

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

$ 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-> जांच () ठीक काम करने लगता है


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

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