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

Kevin Ushey kevinushey at gmail.com
Wed Nov 20 18:48:13 CET 2013


Also, see the section in R-exts on debugging compiled code:
http://cran.r-project.org/doc/manuals/R-exts.html#Debugging-compiled-code

gdb can often point you either at, or close to, the code causing the
segfault, which helps to narrow the search.

-Kevin

On Wed, Nov 20, 2013 at 9:35 AM, Dirk Eddelbuettel <edd at debian.org> wrote:
>
> 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
> _______________________________________________
> Rcpp-devel mailing list
> Rcpp-devel at lists.r-forge.r-project.org
> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel


More information about the Rcpp-devel mailing list