C:奇怪的行为:返回值返回值更改
我的应用程序面临着非常非常奇怪的行为.
我要描述我的情况,然后解释出了什么问题. 情况 我有一个这样的签名方法: const StructureDef *getStructure(const std::string &theme,int index); 我在这段代码中称之为: const StructureDef *sDef = 0; do { sDef = ss->getStructure(theme,rand() % ss->availableStructureCount()); } while (!sDef); 我使用这个do-while结构,因为getStructure方法的返回值可能为NULL,这取决于主题和索引的组合.所以基本上,它做的是要求随机结构,直到我们得到一个有效的结构. (如果您想了解详细信息,请查看截图.) 该方法遍历一个std :: vector< StructureDef>使用它是:: iterator.而对于每个StructureDef,它检查结构是否属于该主题.如果是这样,请增加计数器并检查是否等于所请求的索引.喜欢这个: // inside the loop if (i++ == index) 当这样成功时,返回当前的StructureDef *: return sDef; 出了什么问题 我正在使用XCode 4.4它的调试器来逐步看到发生了什么,这基本上是gdb. 首先解释的方法是找到符合我需要的StructureDef *.所以它返回那个指针.以下是在调试器中返回之前的截图: (循环后的行简单地返回0;) 这里指针sDef *指向0x1d563270,这是StructureDef的正确实例所在的位置. 下一个屏幕截图是我在调用该方法的代码段中获得的: 如你所见,指针sDef *,它得到了方法的返回值,现在指向0x2fe03804.这不是所有方法返回的!我认为这是指针指向堆栈的某个地方,而不是堆. (它应该是堆,因为std :: vector类将其对象存储在堆上,对吗?). 我不能使用Valgrind,因为我在Mac OS X 10.8,Valgrind不支持. 我完全惊讶于这种行为.我看不出为什么会发生这种情况…可能是我的编译器坏了,还是在做一些奇怪的“优化”? 提前致谢! 澄清DeadMG的评论: 我使用不同的主题: iron wood ice 等等… 我的标识符如下所示: iron__downside_touch_and_go iron__platform__700_65 iron__wall_bang wood__platform__600_40 等等…我想做的是在一个主题中选择具有特定索引的结构.所以索引不是所有主题的结构集合在一起,而是一个主题的子集的索引.再看看这段代码:) 更新! 我给错了信息.该向量的类型为std :: vector< StructureDef>!它存储对象.不是指针! 那么我正在用的是.operator->()调用与(&)(* it)相同.看起来它正在工作.对我来说,看起来有点笨,写&和*之后. @Ben Voigt: 建筑: 优化: 解决方法
它看起来像我正在使用的调试器(LLDB,而不是我首先的GDB)没有正确显示内存值.切换到GDB之后,调试器显示了我除外的内存地址.当我添加如下打印声明:
printf("StructureDef* pointer = %llxn",(unsigned long long int)(void*) sDef); 看起来GDB是对的.为了测试的目的,我切换回LLDB,并且神奇地也正常工作. 也许,我正在处理这个人写的内容:https://stackoverflow.com/a/9709462/155137 我希望它是LLDB调试器中的一个错误.因为,否则,我认为在我的安装中有一些真正的破坏. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |