我要描述我的情况,然后解释出了什么问题.
情况
我有一个这样的签名方法:
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:
建筑:
优化: