C:奇怪的行为:返回值返回值更改

前端之家收集整理的这篇文章主要介绍了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 = %llx\n",(unsigned long long int)(void*) sDef);

看起来GDB是对的.为了测试的目的,我切换回LLDB,并且神奇地也正常工作.

也许,我正在处理这个人写的内容https://stackoverflow.com/a/9709462/155137

我希望它是LLDB调试器中的一个错误.因为,否则,我认为在我的安装中有一些真正的破坏.

原文链接:https://www.f2er.com/c/114693.html

猜你在找的C&C++相关文章