首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >奇怪的指针行为C++ /继承

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

Stack Overflow用户
提问于 2015-05-07 02:20:27
回答 1查看 342关注 0票数 1

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

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

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

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

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

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

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

总之,我有一个指向派生类对象的基类指针。函数调用很好地工作在这个指针上,在它所创建的函数中,以及在返回给它的函数中。只有当指针作为基类指针的参数传递时,我才开始看到成员变量被设置为0,函数调用导致分段错误/coredump。

我想做的是C++不允许做的事情吗?谢谢任何人能给我的帮助。

编辑:我已经附上了下面的代码。生物是基本的情况;Goblin是派生的情况;函数F1:

代码语言:javascript
运行
复制
Creature* characterSelect()
{
    Creature* creature;
    Goblin gb1 = Goblin();
    creature = &gb1;
    return creature;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-07 04:17:58

代码语言:javascript
运行
复制
Creature* creature;
Goblin gb1 = Goblin();
creature = &gb1;
return creature;

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

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

代码语言:javascript
运行
复制
Goblin *gb1 = new Goblin();
return gb1;

这样就分配了堆,Goblin实例在您传递它时将保持不变。

请参阅:returning local variables

“那我什么时候把它删除呢?”

阅读“所有权”的概念--你需要跟踪Goblin实例“属于”谁,当没有更多相关的所有者时,你就删除它。在实际代码中,您无论如何都不希望使用裸指针,而是使用“智能指针”(即std::shared_ptrstd::unique_ptr)来跟踪这些指针,并在不再需要对象时自动删除。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30090845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档