在我的应用程序中,我有一对嵌套循环,它们遵循类似嵌套的链表以解析数据。我犯了一个愚蠢的错误,并将一个结构作为子结构,例如:
if (((ENTITY *) OuterEntityLoop->data)->visible == true) {
代替:
if (((ENTITY_RECORD *) OuterEntityLoop->data)->entity->visible == true) {
这导致了一个问题,大约 70% 的运行会导致应用程序完全停止——不是崩溃,只是坐着旋转。程序流中的诊断printf
程序会以奇怪的顺序触发或根本不触发,尽管它在大多数情况下自发恢复了几次,但它破坏了应用程序。
事情就是这样。即使在将内部逻辑缩减为绝对不是基于逻辑错误的无限循环之后,循环仅包含 my printf
,它仍然被破坏。
第二件事:当结构被错误地识别时,如果我试图访问一个不存在的属性,即使它没有现存的属性,它仍然会抱怨。
我的问题是:
- 为什么这会破坏内存?简单地读取垃圾内存会破坏程序的控制结构吗?如果没有,这是否意味着即使 Electric Fence 不再抱怨,我的某个地方仍然存在泄漏?
- 我认为它抱怨不存在的属性的原因是因为它符合给定的类型定义,而不是实际存在的内容。既然我已经把它打出来了,这在我的脑海里就不那么可疑了,但我想确认我没有离开这里。