奇怪的指针行为C ++ /继承

时间:2015-05-07 02:20:28

标签: c++ pointers inheritance

我正在使用指针,我想知道我是否正在做一些根本不起作用的事情。

对于某些背景,我创建了一个基类和一个派生类。此派生类继承了这些变量的一些成员变量和一些get / set函数。此派生类还实现了从基类继承的两个纯虚函数。

现在在包含与这些类交互的代码的主文件中,我有三个函数,称为f1,main和f2。

F1创建派生类的实例,并返回指向此派生类的基类指针。在这个类F1中,我检查了int成员变量是否已设置为正确的数字,并且还检查派生类继承的虚函数是否已正确实现。变量和函数都在F1范围内正确设置/工作。

Main接收指向此派生类的此基类指针。在这个main函数中,我再次检查是否已将int成员变量设置为正确的数字,并且还检查派生类继承的虚函数是否已正确实现。变量和函数都在主范围内正确设置/工作。

但是,当我将指针作为基类指针参数传递给函数F2时。 int成员变量设置为0,当我访问虚函数时,我收到分段错误/核心转储错误。

为了进一步缩小原因,我访问了派生类实现文件,并在实现文件中创建了该对象的实例,并看到一切都按预期工作。

总而言之,我有一个指向派生类对象的基类指针。函数调用在它生成的函数中以及在返回函数的函数中完美地工作。只有当指针作为基类指针的参数传递时,我才开始看到成员变量设置为0并且函数调用导致分段错误/ coredump。

我正在尝试做一些C ++中不允许的事情吗? 感谢任何人都能给我的帮助。

编辑: 我在下面附上了代码。 生物是基本情况;地精是派生的案例; 功能F1:

Creature* characterSelect()
{
    Creature* creature;
    Goblin gb1 = Goblin();
    creature = &gb1;
    return creature;
}

1 个答案:

答案 0 :(得分:4)

Creature* creature;
Goblin gb1 = Goblin();
creature = &gb1;
return creature;

您正在返回对堆栈中对象的引用;在函数返回后尝试访问它是未定义的行为(即错误)。内存被回收,可能仍然有效,直到它被覆盖;这就是为什么你看到仍然在主要工作的东西。

您需要使用new创建您的精灵:

Goblin *gb1 = new Goblin();
return gb1;

这样就分配了堆,当你传递它时Goblin实例会持续存在。

请参阅:returning local variables

“那么什么时候删除呢?”
阅读“所有权”的概念 - 您需要跟踪Goblin实例“属于”的对象,并且只要没有更多相关所有者,就会删除它。在实际代码中,你不会想要使用裸指针,而是使用“智能指针”(即std::shared_ptrstd::unique_ptr)来跟踪它,并在对象出现时自动删除不再需要了。