代码之家  ›  专栏  ›  技术社区  ›  P Shved

Ocaml“内存不足”异常;详细模式显示“结构比较中的堆栈溢出”

  •  3
  • P Shved  · 技术社区  · 15 年前

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

    Hashtbl.mem loc_to_no loc
    

    OCAMLRUNPARAM="v=63" ,我看到在崩溃前打印的一行:

    所涉及的结构定义如下。 loc 是一种 location .

    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 ;
    }
    

    1 回复  |  直到 15 年前
        1
  •  7
  •   newacct    15 年前

    嗯,哈希表查找使用“ = “(结构平等)确定某个键是否与您要查找的键相同。结构相等需要深入检查所有子结构和内容。您有一个复杂的递归数据结构。可能在某个点上结构中存在一个循环,这将导致它无限循环。在任何情况下,请考虑您希望哈希表如何告诉我如果某个键与您的键相同,则需要使用该类型的相等,而不是默认的结构相等;使用 Hashtbl.Make