[Rcpp-devel] Interfacing Rcpp with a C library: memory allocation

Dirk Eddelbuettel edd at debian.org
Wed Nov 20 18:35:39 CET 2013


On 20 November 2013 at 18:27, Alessandro Mammana wrote:
| Dear all,
| I'm trying to write some efficient code for analyzing sequencing data
| in R. To do this I would like to use the C library samtools. I've
| created a package where the src directory looks like this:
| 
| src
| |-- Makevars
| |-- RcppExports.cpp
| |-- mysourcecode.cpp
| `-- samtools
|     |-- all *.c and *.h files as well as an independent Makefile
| 
| My Makevars file looks like this:
| 
| PKG_CPPFLAGS = -Isamtools
| PKG_LIBS = `$(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()"`
| PKG_LIBS += -Lsamtools  -lbam -lz -lpthread
| 
| $(SHLIB): samtools/libbam.a
| 
| samtools/libbam.a:
|       @(cd samtools-0.1.19 && $(MAKE) libbam.a \
|           CC="$(CC)" CFLAGS="$(CFLAGS) $(CPICFLAGS)" AR="$(AR)"
| RANLIB="$(RANLIB)")
| 
| Everything compiles and I get my cpp functions in R, however I am
| getting some weird segfaults, I think they are due to memory
| allocation, but it's hard for me to track them. Especially now, these
| errors are showing up not immediately, but at the second time that I
| call a Rcpp function.
| 
| I wanted to ask the following:
| 1. Is it the right way of using external C libraries? I couldn't find
| much documentation around

Sure.

| 2. The C library uses malloc and free, and so do I (as little as
| possible, just to interface with the library), is this mechanism
| clashing against Rcpp/R memory management? Could it happen, for
| instance, that R tries to free allocated memory that I already
| manually freed myself?

Yes. 

Please read the "Writing R Extensions" manual, section 6.1.2, on
User-controlled memory. 

And/or see the Rcpp documentation: if you actually use our data containers,
things "just work", ie 

  R> cppFunction("NumericMatrix foo(int n) { return NumericMatrix(n); }")
  R> foo(2)
       [,1] [,2]
  [1,]    0    0
  [2,]    0    0
  R> foo(4)
       [,1] [,2] [,3] [,4]
  [1,]    0    0    0    0
  [2,]    0    0    0    0
  [3,]    0    0    0    0
  [4,]    0    0    0    0
  R> 

will never create a segfault. Ditto for using proper C++ containers (eg
std::vector<double>).

But you cannot randomly match the C approach (see Section 6.1.2, as mentioned
above) and the R/Rcpp approach.
 
| In general I didn't understand much about memory allocation in Rcpp
| and I couldn't find many resources talking about it. Is there anything

Well I could recommend a book to you...  There are also eight vignettes in
the package, and the more on other sites (the list archive, our blogs,
StackOverlow, Hadley's draft book).

| R- or Rcpp-specific that I have to keep in mind or should I program as
| if I were programming in C/C++?

You can provided you do it right.  

Hope this helps, if it was unclear please come back with more questions.
Also see the unit tests and examples.

Cheers, Dirk

-- 
Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com


More information about the Rcpp-devel mailing list