[Rcpp-devel] Segfaults for a function returning list of vectors of indices

Douglas Bates bates at stat.wisc.edu
Tue Feb 28 20:52:34 CET 2012


On Tue, Feb 28, 2012 at 1:22 PM, Dirk Eddelbuettel <edd at debian.org> wrote:
>
> On 28 February 2012 at 10:54, Chris DuBois wrote:
> | Hi all,
> |
> | Given a vector of integers x = sample(1:K,N,replace=TRUE) with N > K,
> | I want to return a list where element k is a vector of indices i where
> | x[i] = k.  (If there is already an R function for this, please let me
> | know!)  Here is the Rcpp code:
> |
> | // xr: vector of integers
> | // mr: max
> | superwhich <- cxxfunction(signature(xr="integer",Kr="integer"),
> | '
> | int K = as<int>(Kr);
> | Rcpp::IntegerVector x(xr);
> |
> | // Initialize vector of vectors
> | std::vector< std::vector<int> > xx;
> | for (int i = 0; i < K; i++) {
> |   std::vector<int> tmp(0);
> |   xx.push_back(tmp);
> | }
> |
> | // Push onto appropriate vector for each element of x
> | for (int i = 0; i < x.size(); i++) {
> |   xx[x[i]].push_back(i);
> | }
> |   return wrap(xx);
> | ', plugin="Rcpp")
> |
> | For example:
> | > x <- c(1,3,3,1)
> | > superwhich(x,4)
> | [[1]]
> | integer(0)
> |
> | [[2]]
> | [1] 0 3
> |
> | [[3]]
> | integer(0)
> |
> | [[4]]
> | [1] 1 2
> |
> |
> | So with large vectors and large values of K, I occasionally get
> | segfaults.  I believe I have thoroughly checked that I am not making
>
> Second one today of that flavour :-/
>
> | indexing errors.  I believe I am running into garbage collection
> | issues.  Isn't wrap() good enough to make R objects?  I could use
> | Rcpp::List from the start, but is there an equivalent of push_back for
> | Rcpp::IntegerVectors?  (I've read the documentation, and I apologize
> | in advance if I am missing something obvious.)
>
> I do not think you do.  "Occassionally" things seem to go astray on large
> problems. I don't usually get hit by this.
>
> Doug Bates however had issues with RcppEigen and has been using memory
> debuggers like valgrind.  The issue is that those are somewhat hard to use,
> slow everything down and maybe demand on idea of the underlying code.
> That said, you can also "just run" with valgrind and see if it reports
> something.

I don't think it was RcppEigen that was causing troubles.  Are you
thinking of tracking down the failure to protect the expr argument to
the Rcpp::Evaluator::run?

Anyway, if you are willing to put up with slower execution while you
are debugging and have valgrind installed you can use

R CMD BATCH --vanilla -d valgrind myBatchRFileName.R


> Dirk
>
> --
> "Outside of a dog, a book is a man's best friend. Inside of a dog, it is too
> dark to read." -- Groucho Marx
> _______________________________________________
> 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