Dave's Brain

Browse - programming tips - libical memory allocation

Date: 2010may17
Product: libical

Q.  How does libical allocate memory?  Who owns it?

A.  The function name determines who (libical or the caller) owns
the memory.

Here is the relevant section excerpted from ~/doc/UsingLibical.txt in version 0.44

If that's not current, you can search for the first sentence:
http://www.google.com/search?q=Libical+relies+heavily+on+dynamic+allocation

	Memory Management 
	
	Libical relies heavily on dynamic allocation for both the core objects
	and for the strings used to hold values. Some of this memory the library
	caller owns and must free, and some of the memory is managed by the
	library. Here is a summary of the memory rules. 
	
	1) If the function name has "new" in it, the caller gets control
	   of the memory. ( such as icalcomponent_new(), or icalproperty_new_clone() ) 
	
	2) If you got the memory from a routine with new in it, you must
	   call the corresponding *_free routine to free the memory. ( Use
	   icalcomponent_free() to free objects created with icalcomponent_new() ) 
	
	3) If the function name has "add" in it, the caller is transferring
	   control of the memory to the routine. ( icalproperty_add_parameter() )
	
	4) If the function name has "remove" in it, the caller passes in
	   a pointer to an object and after the call returns, the caller owns
	   the object. So, before you call icalcomponent_remove_property(comp,foo),
	   you do not own "foo" and after the call returns, you do. 
	
	5) If the routine returns a string and its name does NOT end in "_r",
	   libical owns the memory and will put it on a ring buffer to reclaim
	   later. For example, icalcomponent_as_ical_string().  You'd better
	   strdup() it if you want to keep it, and you don't have to delete it. 
	
	6) If the routine returns a string and its name *does* end in "_r", the
	   caller gets control of the memory and is responsible for freeing it.
	   For example, icalcomponent_as_ical_string_r() does the same thing as
	   icalcomponent_as_ical_string(), except you now have control of the
	   string buffer it returns.
What this info useful to you? You can donate to say thanks

Add a comment

Sign in to add a comment
Copyright © 2008-2012, dave - Code samples on Dave's Brain is licensed under the Creative Commons Attribution 2.5 License. However other material, including English text has all rights reserved.