Dear All:

I am writing a program that include a main loop written in Ocaml and a sub-module written in C. The main loop called the sub-module a lot, and a huge array is returned from each call.

So I use the standard C-Caml interface to return these huge data as shown below:

extern "C"   value minisat_save_proof(value unit) {
    CAMLparam0();
    CAMLlocal1( ml_data );
 
  vec<long>& vi=(solver->proof)->save("minisat_save_proof");
  int sz=vi.size();
  ml_data = caml_alloc (sz,0);
  for (int i=0;i<sz;i++) {
   Store_field( ml_data, i, Val_int((int)(vi[i])) );
  }
 
  CAMLreturn( ml_data );
}

In the main ocaml program loop, there is a call to a ocaml method A, which again call this C method minisat_save_proof.

When ocaml method A got these data returned from minisat_save_proof, it call another method B to clear all data structure in the sub-module written in C, and then exit to the main loop and call Gc.compress to collect all garbage. 
 
So in this case I think the memory usage of my program should be the same like before calling minisat_save_proof , because the returned data should be collected by the garbage collector when exiting the method A to the main loop.

But from the unix "top" command, I find that these huge return data seems to remain in memory and consume all my memory step by step.

So I want to know if there is any method to free these data?