2011-05-29 49 views
1

我正在使用Dijkstra找到完成某个谜题的最短路径,其中谜题的工作方式如下。你有五个密码子,可以是-4到4之间的任何一个(虽然它们的表示方式不同,-4/4为“非常低/高”,-3至-1或1至3为“低/高” ,并且“完成”为0)。其目标是将所有五个设置为0,使用20种不同的“技术”,将密码值提高/降低一定量。如果某种技术会在边界之外修改其中一个密码,即高于4或低于-4,那么它将不会执行任何操作。所以,我将它表示为一个图,其中节点是密码值的所有可能的组合,起始节点是完成的节点(0,0,0,0,0)。为了更容易,我将密码表示为从0到8的值,其中4是完整值 - 这使我可以将它们的基数9转换为图的数组索引,因此不会浪费在搜索上。我的Dijkstra算法中可能存在的free()问题

现在,我已经把它全部剔除了,而且我一直在调试并试图弄清楚什么是错误的,通常我会找出问题并修复它 - 但是这个让我难住。我存储的节点有确定的距离,但没有在链表中访问,以便轻松弹出访问节点。当链表到达14256个节点时,它会失败 - 但是它没有做的是在链表元素上的一个free()被弹出。我不知道什么可能导致免费()失败,我还没有找到任何帮助。

我之前没有问过任何问题,所以我不知道礼节 - 我将把整个资料放在这里,因为我不知道在这种特殊情况下什么是和不相关的,但它大约有140条线,比较大。在进一步细读时,似乎并没有真正的标签或任何东西,所以我现在就把它放在键盘上。

http://codepad.org/I0K0ETsU

编辑:好的。好的。现在我变得彻底困惑。我决定只是对它进行评论,否则就没有什么问题了。它结束,吐出output.txt,并且文本文件看起来是完全正确的。我无法弄清楚在没有别的错误的情况下,代码中的内容会导致它在free()上崩溃。

+0

什么样的失败? – 2011-05-29 00:53:53

+0

Windows只会关闭它,并说“有问题导致程序无法正常工作。” – Santiclause 2011-05-29 01:09:29

回答

0

事实证明,问题在于我没有在malloc()的字符串长度内包含\ 0字符。

1

经过粗略的审查后,它看起来像池 - >下一步被初始化为温度,并在那个时候,temp-> next是未初始化。所以,当你将列表放到temp-> next并尝试释放它时,你将释放未初始化的指针(或者你不拥有的内存)。

+0

如果temp-> next未初始化(我不认为),它不应该尝试释放temp-> next - 根项目池的值是链接列表中元素的总数,因此遍历链表不会超出边界,以达到未初始化的指针。 – Santiclause 2011-05-29 01:08:25

1

一个free通常会失败,只有几个原因:

  • 尝试释放一个NULL指针
  • 尝试释放东西是之前已经free'd(双免费)
  • 尝试释放无效的东西(即释放垃圾地址)
  • 内存损坏(存储有关已分配段的信息的区域已被溢出)
+3

这里只是一个注释,它实际上是一个完全安全的空指针调用free。 – 2011-05-29 00:56:25

+1

'man 3p free':如果ptr是空指针,则不会发生任何操作。先生,好的电话。 – 2011-05-29 00:58:43