Crash Ocaml“;“内存不足”;例外情况;详细模式表示“详细”;“结构比较中的堆栈溢出”;

Crash Ocaml“;“内存不足”;例外情况;详细模式表示“详细”;“结构比较中的堆栈溢出”;,crash,ocaml,out-of-memory,Crash,Ocaml,Out Of Memory,需要修复来自外星源的非常庞大的ocaml程序。其中一个问题是程序在看似无辜的线路上崩溃: Hashtbl.mem loc_to_no loc “内存不足”异常。问题是,那里肯定有足够的内存,这一行对于其他输入执行得很好,甚至在处理问题的过程中执行得更早 在使用OCAMLRUNPARAM=“v=63”运行它之后,我看到在崩溃之前打印的一行: 结构比较中的堆栈溢出 所涉及的结构定义如下loc属于位置类型 type ('a, 'b, 'c) automaton = { aut_id : int

需要修复来自外星源的非常庞大的ocaml程序。其中一个问题是程序在看似无辜的线路上崩溃:

Hashtbl.mem loc_to_no loc
“内存不足”异常。问题是,那里肯定有足够的内存,这一行对于其他输入执行得很好,甚至在处理问题的过程中执行得更早

在使用
OCAMLRUNPARAM=“v=63”
运行它之后,我看到在崩溃之前打印的一行:

结构比较中的堆栈溢出

所涉及的结构定义如下
loc
属于
位置类型

type ('a, 'b, 'c) automaton = {
  aut_id : int ;               
  mutable start_location : (('a, 'b, 'c) location) option ;
  mutable end_location   : (('a, 'b, 'c) location) option ;
  mutable aut_attributes : 'a ;                            
}
and ('a, 'b, 'c) location = {                              
  loc_id : int ;
  mutable succs : ('c * ('a, 'b, 'c) location) list ;
  mutable preds : ('c * ('a, 'b, 'c) location) list ;
  automaton : ('a, 'b, 'c) automaton ;
  mutable loc_attributes : 'b ;
}

如何执行代码?

好的,哈希表查找使用“
=
”(结构相等)来确定某个键是否与您要查找的键相同。结构平等性要求深入检查所有子结构和材料。您有一个复杂的递归数据结构。也许在某个点上结构中存在一个循环,这将导致它无限循环。在任何情况下,考虑一下您希望哈希表如何判断一个键是否与您的键相同,然后您需要使用这种类型的相等,而不是默认的结构相等;使用
Hashtbl.Make
functor定义具有自定义相等和/或哈希函数的哈希表模块。

是的,它可以工作。默认情况下,Hashtbl使用
=
比较键,这是递归的。我制作了一个使用
==
的函子,这个操作符不是递归比较的;但在这种情况下,请确保传递的对象与最初用作键的对象相同(而不仅仅是具有相同结构的另一个对象)