|
Top Document: comp.windows.x.intrinsics Frequently Asked Questions (FAQ) Previous Document: 23. How do I reparent a widget in Xt, i.e. XtReparentWidget()? Next Document: 25. How to debug an Xt application? See reader questions & answers on this topic! - Help others by sharing your knowledge
----------------------------------------------------------------------
Unfortunately, most code that calls malloc(), realloc() or calloc()
tends to ignore the possibility of returning NULL. At best it is
handled something like:
ptr = (type *) malloc (sizeof (type))
if (!ptr)
{
perror ("malloc in xyzzy()");
exit (1)
}
To handle this common case the Intrinsics define the functions
XtMalloc(), XtCalloc(), XtNew(), XtNewString() and XtRealloc() which
all use the standard C language functions malloc(), calloc() and
realloc() but execute XtErrorMsg() if a NULL value is returned. Xt
error handlers are not supposed to return so this effectively exits.
In addition, if XtRealloc() is called with a NULL pointer, it uses
XtMalloc() to get the initial space. This allows code like:
if (!ptr)
ptr = (type *) malloc (sizeof (type));
else
ptr = (type *) realloc (ptr, sizeof (type) * (count + 1));
++count;
to be written as:
ptr = XtRealloc (ptr, sizeof (ptr) * ++count);
Also, XtFree() accepts a NULL pointer as an argument. Generally, I've
found the Xt functions conveniant to use. However, anytime I'm
allocating anything potentially large I use the standard functions so
I can fully recover from not enough memory errors.
XtNew() and XtNewString() are conveniant macros for allocating a
structure or copying a string:
struct abc *xyzzy;
char *ptr;
char *str = "abcdef";
xyzzy = XtNew (struct abc); /* takes care of type casting */
ptr = XtNewString (str);
A strict interpretation of the Intrinsics reference manual allow an
implementation to provide functions that are not exchangable with
malloc() and free(). I.e. code such as:
char *ptr;
ptr = XtMalloc (100);
/* ... */
free (ptr);
may not work. Personally, I'd call any implementation that did this
broken and complain to the vendor.
A common error for Motif programmers is to use XtFree() on a string
when they should really be using XmStringFree().
User Contributions:Top Document: comp.windows.x.intrinsics Frequently Asked Questions (FAQ) Previous Document: 23. How do I reparent a widget in Xt, i.e. XtReparentWidget()? Next Document: 25. How to debug an Xt application? Single Page [ Usenet FAQs | Web FAQs | Documents | RFC Index ] Send corrections/additions to the FAQ Maintainer: ware@cis.ohio-state.edu
Last Update March 27 2014 @ 02:11 PM
|

Comment about this article, ask questions, or add new information about this topic: