gpt4 book ai didi

c++ - 关于返回对象地址的困惑

转载 作者:太空狗 更新时间:2023-10-29 21:50:18 26 4
gpt4 key购买 nike

我有以下代码(删除了一些代码以将其剥离为必需品;使用的一对方法/属性应该是不言自明的):

void testApp::togglePalette(){
GraphicalEntity* palette= this->getEntityByName("palette-picker");
cerr << palette << endl;
}

GraphicalEntity* testApp::getEntityByName(string name){
list<GraphicalEntity*>::iterator j;
for(j=screenEntities.begin(); j!=screenEntities.end();++j){
if ((*j)->getTypetag() == name){
cerr << *j << endl;
return *j;
}
}
}

输出如下:

0x54bda0
0

我很困惑 - 为什么 togglePalette() 中的 palette 不等于从 getEntityByName 返回的地址(所以 0x54bda0 在当前情况),但到 0

谢谢!

编辑:正如 Fred 在他的一条评论中指出的那样,这确实是编译器被代码到达函数末尾而没有返回任何内容所混淆的问题。

添加:

return (GraphicalEntity*) NULL;

在我的 getEntityByName 方法结束时解决了这个问题。非常感谢!

我仍然对为什么即使找到对象该方法仍会返回 0 感到困惑(就像我实现代码的方式一样,众所周知总会找到一些东西) - 对此的任何解释都将非常受欢迎!

最佳答案

根据我的评论,这里有一个更完整的答案。

在您的 testApp::getEntityByName() 方法中有一个路径,控制在该路径中退出该方法而不返回值。根据您的编译器、体系结构和调用约定,这可能会导致机器代码无法工作即使您的流程从未经过错误路径

根据调用约定,在方法返回之前或之后清理堆栈是调用者或被调用方法的责任。返回值及其在内存中的分配位置是该约定的一部分,编译器希望函数始终返回相同的类型,无论函数内的控制流是什么。正因为如此,它可以通过重新排列一些东西并生成特定的清理代码来优化一些方法,以根据调用约定清理恢复堆栈。在任何情况下,丢失的返回值都会扰乱优化或清理,因为它违反了编译器在处理您的代码时认为理所当然的事情,即每条路径都返回一个指向 GraphicalEntity 对象的指针.如果该假设失败,则会损坏堆栈或其内容,并且您最终会得到一个 NULL 指针(它可能已经崩溃或做了几乎任何其他事情,这都是未定义行为的一部分)。

关于c++ - 关于返回对象地址的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6457935/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com