[mercury-users] Memory management when CPP calls Mercury

Fergus Henderson fjh at cs.mu.OZ.AU
Fri Dec 14 00:18:31 AEDT 2001

On 13-Dec-2001, Ondrej Bojar <oboj7042 at ss1000.ms.mff.cuni.cz> wrote:
> I intend to use my Mercury predicates in a C++ program. My predicates get
> a string and return MR_list. I know, how to parse MR_list in C++, but I
> don't understand what exactly does conservative garbage collector.

With the conservative garbage collector,
the process of actually doing a garbage collection
happens as part of a call to the allocation routine
(e.g. GC_malloc()) when sufficient memory has been
allocated since the last full collection.

> I'm afraid of not releasing memory occupied by the MR_list when done in C.
> Proper releasing of memory is crucial for me, since the C++ program looks
> like:
> while (1) {
>   char * a_new_thing;
>   MR_list parsed_thing;
>   a_new_thing = malloc_and_get_the_thing_from_somewhere();
>   parsed_thing = my_mercury_function(a_new_thing);
>   read_mr_list_and_dump_it_somewhere(parsed_thing);
>   free(a_new_thing);
>   /* should I release MR_list parsed_thing now? And how? */
> }
> I release the string with free(a_new_thing), but how do I release MR_list
> parsed_thing? Or does this Mercury for me? When?

With the conservative collector, there is no need to
deallocate the list; it will get garbage collected
in some future iteration of the loop, when my_mercury_function()
does further memory allocation.  my_mercury_function() will allocate
memory by calling GC_malloc(), and GC_malloc() will eventually decides
that it is time to do garbage collection.

> I need also the other way:
> while (1) {
>   int *input_array;
>   MR_list input_list;
>   char * parsed_thing;
>   input_array = malloc_and_get_from_somewhere_a_list_of_numbers();
>   input_list = use_MR_cons_to_build_MR_list_from_array(input_array);
>   free(input_array);
>   parsed_thing = my_mercury_function_to_parse_list(input_list);
>   printf("Got: %s\n", parsed_thing);
>   /* should I free parsed_thing now? (using free() I guess) */
> }

The same applies -- you don't need to free it.

Using free() will definitely not work.  If you really want to explicitly
deallocate the memory, you'd need to use GC_free() rather than free().
However, this only works if the memory was allocated on the conservative
garbage collector's heap (with GC_malloc()).  It will crash if, for
example, the string returned is one that the Mercury compiler has
allocated in read-only memory.  So I strongly advise against this.
Just leave it to the garbage collector.

Fergus Henderson <fjh at cs.mu.oz.au>  |  "I have always known that the pursuit
The University of Melbourne         |  of excellence is a lethal habit"
WWW: <http://www.cs.mu.oz.au/~fjh>  |     -- the last words of T. S. Garp.
mercury-users mailing list
post:  mercury-users at cs.mu.oz.au
administrative address: owner-mercury-users at cs.mu.oz.au
unsubscribe: Address: mercury-users-request at cs.mu.oz.au Message: unsubscribe
subscribe:   Address: mercury-users-request at cs.mu.oz.au Message: subscribe

More information about the users mailing list