怪异的指针行为C /继承

Weird pointer behavior C++ / inheritance

本文关键字:继承 指针      更新时间:2023-10-16

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

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

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

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

主要收回此基类指向此派生类的指针。在此主要功能中,我再次检查以查看INT成员变量已设置为正确的数字,并且还检查是否正确实现了派生类继承的虚拟函数。变量和函数均在主范围中正常设置/正常工作。

但是,当我将指针作为基类指针参数传递到功能F2时。int成员变量设置为0,当我访问虚拟函数时,我会收到一个分割故障/核心转储错误。

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

总结一下,我有一个指向派生类对象的基类指针。函数调用在该指针上完美工作,并在其制作的函数和返回的函数中工作。只有当指针作为基类指针的参数传递时,我才开始看到成员变量设置为0,并且函数调用导致分段故障/核心。

我想做的是C 中不允许的事情吗?感谢任何人都可以给我的任何帮助。

编辑:我已经附加了下面的代码。生物是基本情况;地精是派生的情况;功能F1:

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

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

您需要使用new创建妖精:

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

这样,分配了堆,并且当您传递时,Goblin实例将持续。

请参阅:返回本地变量


"所以我什么时候删除它?"
阅读"所有权"的概念 - 您需要跟踪哥布林实例"属于"的人,并且只要没有更多相关所有者,就可以删除它。在实际代码中,您不想无论如何都不想使用Bare Pointer,而是使用"智能指针"(即std::shared_ptrstd::unique_ptr),它可以为您跟踪它,并在不再需要对象时自动删除。