Hi guys,
Apologies if I'm beating a dead horse but I think I've never wondered about this: What are the assumptions related to the garbage collector when an exception is raised?
I sort-of always assumed it would be run but it doesn't seem that this is the case. This code:
let () =
let g () =
let f _ =
Printf.printf "Collecting x\n%!"
in
let x = Bytes.create 1024 in
Gc.finalise f x;
()
in
g ();
Gc.full_major();
raise Not_found
Shows that the finalization function is never call if I remove the call to full_major. Any reason for that?
The reason I'm asking if that I know I've been writing C bindings where some cleanup operations are wrapped up in the finalization code with the expectation that, except for a hard crash, it would always be executed at some point in the future..
Thanks for y'all comments!
Romain