[R] Error messages and C
Ross Boylan
ross at biostat.ucsf.edu
Fri Aug 20 23:39:21 CEST 2004
On Fri, 2004-08-20 at 12:04, Thomas Lumley wrote:
> On Fri, 20 Aug 2004, Ross Boylan wrote:
>
> > I am calling a C (C++ really) function via the .C interface.
> > Sometimes when things go wrong I want to return an error message.
> >
> > 1. R provides C functions error and warning which look about right.
> > But exactly how does this exit, and in particular what happens with
> > cleaning up, calling C++ destructors, and unwinding the stack? Will I
> > get memory leaks?
>
> Memory handled by R will be reclaimed properly (ie R_alloc, but not
> Calloc). C++ destructors will not be called -- you have to do that
> yourself either before calling error()
That's not hard in my case, so that's what I'm doing.
> or in subsequent cleanup code that
> you call from R (perhaps triggered by on.exit()).
That would be tricky, since the location of the objects to be destroyed
is only known inside my original function. Of course, I could use
global variables...
>
> R does have a finalizer mechanism that you could use. I have never tried
> this but there are some notes at
> http://www.stat.uiowa.edu/~luke/R/references/weakfinex.html
> This allows C or R functions to be called by the garbage collector when an
> object is disposed of. You can then put an object on the R heap so that
> when R tidies this object up it will call your C++ destructors.
>
The weak references cleaned up are R objects, and my stuff is mostly
non-R objects. I see two possible ways to get this to work:
1) Create some kind of dummy R object with a finalizer that cleans up my
C++ objects.
2) Hook the C++ object creation facilities (via new) into R.
Either approach is complex, possibly not doable, and probably
inefficient. Fortunately, I don't need this.
>
> > 2. Before I discovered those functions, I looked at passing in a
> > character vector as an argument, char ** p in the C code. Exactly how
> > do I use these things? Am I supposed to allocate a string and stuff the
> > pointer in the function argument? Or should I assume *p points to valid
> > space (how much?) and fill it in?
>
> If you think of p as a vector of strings (ie char *p[]) then it
> corresponds to whatever strings you passed in from R. You can modify
> these in place, possibly making them shorter. So if you need 80 characters
> of error message, pass in a string of length at least 80.
If space permits, is this just an ordinary, C-style null terminated
string? Or does R have some notion of the string length which is
unaffected by what I stuff in it?
> If you want to allocate more memory you need to do this through R (either
> R_alloc or the Rinternals functions). Using malloc() and stuffing the
> result in, say, p[1], will cause a memory leak since you won't be able to
> find it and free it.
>
So if I overwrite p[0], for example, the R garbage collector will know
to clean up the old string that was pointed to from that location?
> -thomas
Thanks for the info.
--
Ross Boylan wk: (415) 502-4031
530 Parnassus Avenue (Library) rm 115-4 ross at biostat.ucsf.edu
Dept of Epidemiology and Biostatistics fax: (415) 476-9856
University of California, San Francisco
San Francisco, CA 94143-0840 hm: (415) 550-1062
More information about the R-help
mailing list