【问题标题】:How to fix a memory allocation error in a base class?如何修复基类中的内存分配错误?
【发布时间】:2011-11-14 17:03:18
【问题描述】:

我制作了一个包含两个类的程序。基类包括其派生类的指针对象。然后我在基类的构造函数中初始化指针对象。

我的编译器在编译过程中没有给我错误,但是当控制台窗口出现时程序崩溃,派生类的对象出现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.
}

【问题讨论】:

  • 请修正您的代码缩进。
  • 这是什么语言?你应该相应地标记它。

标签: c++ memory object unhandled-exception


【解决方案1】:

由于在派生类中调用构造函数将调用父类中的构造函数,看起来您将在那里遇到递归构造问题 - 这可能导致异常。

为避免这种情况,您可以将“new x()”从构造函数中移出到它自己的函数中。

【讨论】:

  • 但随后编译器在派生类的数据成员初始化时出错。我现在该怎么办!
【解决方案2】:

正如另一个答案中所解释的,您有一个无限递归的构造问题。您可能想尝试在构造函数中将指针设置为 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();
}

【讨论】:

  • 我也试过了。但是我之前提到的问题是,当我这样做时,父类 Y 和派生类 x 的数据成员仍未初始化,我不知道为什么!
  • 错误弹出为 pacman.exe 中 0x00401dd9 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000020。对于类 x 和 y 的所有数据成员
  • 您确定在创建对象 y 后调用 init() 吗?是的; y.init();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
相关资源
最近更新 更多