实际上在你的小程序中没有内存的重用,所以我猜在垃圾收集之后字符串“a”看起来还是一样的,即使它没有被任何东西引用。
如果每次调用gc,它只会将事物返回到有序状态。最好让gc正常运行,它将运行更多可能的内存状态。
你还必须做一些循环,让它有时间失败。
对你的代码稍加修改的版本实际上对我来说是个错误:
external make_string : string -> unit = "make_string"
external get_string : unit -> string = "get_string"
let () =
while true do
let a = String.make (1024 * 1024) 'a' in
make_string a;
let b = String.make (1024 * 1024) 'b' in
Printf.printf "%s %s\n" (get_string ()) b
done
将值标记为gc根的方法是
caml_register_global_root
caml_register_global_root(&data);
正如你所料,如果我把这个叫做
if (data == 0) {
没有segfault。
这记录在
Section 19.5 of the OCaml manual
.