[Bf-committers] Re: Bf-committers Digest, Vol 16, Issue 47

Jonathan Merritt j.merritt at pgrad.unimelb.edu.au
Fri Nov 25 11:49:15 CET 2005


Yomgui wrote:

>3. just put an "if (malloc == NULL) { handle null pointer }"
>There are not so malloc() in the code... ;-)
>You've already done much complexe things in past, no ? ;-)
>  
>

Of course - I knew I was missing something! :-) :-) :-)

The issue here is that the blocks you refer to normally look something 
like this:

z = malloc(N);
if (z == NULL) {
    /* free x */
    ...
    /* free y */
    ...
    return NULL;   /* or FALSE, or whatever */
}

The list of things to free increases as you progress through your 
mallocs().  Take a look at well-written code that uses image libraries 
(PNG is a great one) for examples of this.

The calling function then has to check for a failed return as well, and 
must proceed to unwrap and free all of its resources, before passing the 
failed result up to ITS caller,  which has to do the same thing, etc...

Now, for atomic events - things that are triggered in response to a 
direct user input and have clear-cut consequences - the desirable 
behaviour is surely to inform the user that their command could not be 
completed.  However, if a failure to allocate memory occurs in an event 
loop or somewhere else where it *should* really succeed, then unwinding 
everything and simply returning a "failure" to the caller is not always 
so simple.

As a hypothetical example (I'm not sure of the code here, so I'm just 
guessing this could happen...), imagine that a memory allocation failure 
were to occur in response to a mouse dragging a vertex of a mesh, or a 
frame-change being unable to draw the scene in the new frame.  What does 
it mean for these actions to "fail"?  Surely these are situations (or 
others very similar) where there would be no recourse but for Blender to 
quit.  In these situations, a "malloc or die" function would be 
desirable, I think.

Jonathan Merritt.



More information about the Bf-committers mailing list