Dear Jeremy, thanks a lot for your elaborate reply. This program works as expected.
open Ctypes open Foreign let f = foreign "f" ((ptr (ptr int)) @-> returning void) let v = ref (from_voidp (ptr int) null) let a = ref (from_voidp int null) let b = ref (from_voidp int null) let _ = v := allocate_n (ptr int) ~count:2 ; a := allocate int 0 ; b := allocate int 1 ; (!v) <-@ (!a); ((!v) +@ 1) <-@ (!b) ; f (!v) ; Gc.full_major () ; f (!v) and the following program is fine too. open Ctypes open Foreign let f = foreign "f" ((ptr (ptr int)) @-> returning void) let v = allocate_n (ptr int) ~count:2 let a = allocate int 0 let b = allocate int 1 let _ = v <-@ a; (v +@ 1) <-@ b ; f v ; Gc.full_major () ; f v However, having v, a, b in a local scope does not work. open Ctypes open Foreign let f = foreign "f" ((ptr (ptr int)) @-> returning void) let _ = let v = ref (from_voidp (ptr int) null) in let a = ref (from_voidp int null) in let b = ref (from_voidp int null) in v := allocate_n (ptr int) ~count:2 ; a := allocate int 0 ; b := allocate int 1 ; (!v) <-@ (!a); ((!v) +@ 1) <-@ (!b) ; f (!v) ; Gc.full_major () ; f (!v) I fail to see why it does not work in this case. >> v <-@ (allocate int 0); > > This allocates an piece of C-memory large enough to hold an integer, > initialized with 0. The address of the allocated memory is written to > the C-memory referenced by 'v'. > > At this point there are no references to the original pointer returned > by 'allocate', so the allocated memory may be freed. Good point: (allocate int 0) is not bound to a variable and thus can be freed. However, in the broken example above, a reference exists and still it does not work. Can you explain why? Thank you. Best regards, Markus _______________________________________________ Ctypes mailing list [email protected] http://lists.ocaml.org/listinfo/ctypes
