Как исправить ошибку выделения памяти в базовом классе?

Я сделал программу, которая содержит два класса. Базовый класс включает в себя объект-указатель своего производного класса. Затем я инициализирую объект указателя в конструкторе базового класса.

Мой компилятор не выдает мне ошибку во время компиляции, но программа вылетает при появлении окна консоли, выдавая ошибку UNHANDLED EXCEPION BAD ALLOCATION для объекта производного класса. Что мне делать, чтобы это исправить?

Вот код:

class x;

class y
{
    private:

      x *objx; // here is the error
    ...........................

};

class x: public y
{
    ...........................
    ................
};

y::y()
{
     objx=new x(); // bad allocation and the program crashes

     // I have also tried this way by commenting objx=new x();

     *objx=0; // but still the program crashes.
}

person alfred ben    schedule 14.11.2011    source источник
comment
Пожалуйста, исправьте отступ кода.   -  person Tudor    schedule 14.11.2011
comment
Что это за язык? Вы должны пометить его соответствующим образом.   -  person jonsca    schedule 15.11.2011


Ответы (2)


Поскольку вызов конструктора в производном классе вызовет конструктор в родительском классе, похоже, что у вас возникнет проблема с рекурсивной конструкцией, которая, вероятно, вызывает исключение.

Чтобы избежать этого, вы можете переместить «новый x()» из конструктора в его собственную функцию.

person Richard    schedule 14.11.2011
comment
но тогда компилятор выдает ошибку при инициализации элементов данных производного класса. Что мне теперь делать! - person alfred ben; 15.11.2011

Как объяснено в другом ответе, у вас есть бесконечно рекурсивная проблема построения. Вы можете попробовать установить указатель в null в конструкторе и создать метод init, который создаст фактический объект:

y::y()
{
     // *objx=0; // this is wrong, you don't want to dereference your pointer.
     objx = 0;   // this should work
}

void y::init()
{
     objx = new x();
}
person Barth    schedule 15.11.2011
comment
я тоже пробовал. но проблема, как я упоминал ранее, заключается в том, что когда я делаю это так, элементы данных родительского класса Y и производного класса x остаются неинициализированными, я не понимаю, почему!! - person alfred ben; 15.11.2011
comment
появляется сообщение об ошибке «Необработанное исключение» по адресу 0x00401dd9 в pacman.exe: 0xC0000005: местоположение чтения нарушения доступа 0x00000020. для всех элементов данных класса x и y - person alfred ben; 15.11.2011
comment
Вы уверены, что вызвали init() после того, как создали объект y? г г; у.инит(); - person Barth; 16.11.2011