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

Posted

技术标签:

【中文标题】奇怪的指针行为 C++ / 继承【英文标题】:Weird pointer behavior C++ / inheritance 【发布时间】:2015-05-07 02:20:27 【问题描述】:

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

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

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

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

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

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

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

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

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

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

Creature* characterSelect()

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

【问题讨论】:

如果您可以发布一些小示例代码而不是试图用文字解释,这将容易得多 代码,而不是英文,会更容易看到发生了什么。 请发布您的源代码,这样更容易理解。 我的猜测是,有些东西比你想象的更早被破坏了,但是没有看到代码,这只是一个猜测。 我的猜测是 f1 这样做:Base* f1() Derived d; return &d; 并且问题与继承无关 【参考方案1】:
Creature* creature;
Goblin gb1 = Goblin();
creature = &gb1;
return creature;

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

你需要用new创建你的妖精:

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

这样它是堆分配的,Goblin 实例在您传递它时将持续存在。

见:returning local variables


“那么我什么时候删除它?” 阅读“所有权”的概念——您需要跟踪 Goblin 实例“属于”谁,并且当没有更多相关所有者时,即删除它。在实际代码中,无论如何您都不想使用裸指针,而是使用“智能指针”(即std::shared_ptrstd::unique_ptr)为您跟踪并在不再需要对象时自动删除。

【讨论】:

谢谢你;该功能现在完全按计划工作!只是一个快速跟进的问题,如果我想在使用它后删除分配的内存,我是否在我的主函数的最后删除并删除地精变量返回的主函数中的指针变量F1?谢谢!!!!!! 您可以在任何需要/需要删除的地方删除指针。这一切都取决于实施。您删除了指向new Goblin 分配的内存的指针,但是现在可以调用该指针。

以上是关于奇怪的指针行为 C++ / 继承的主要内容,如果未能解决你的问题,请参考以下文章

本地指针的奇怪行为[关闭]

遍历 C 指针列表:奇怪的 printf 行为

Maven插件管理配置继承奇怪行为

函数接受结构指针和返回结构指针有奇怪的行为?

C++ ostringstream 奇怪的行为

gcc 的奇怪行为。带有 和 = 的 C++ 对象定义是不是相等?