[Rcpp-devel] Segfault, is it because of iterators/pointers?

Dirk Eddelbuettel edd at debian.org
Tue Feb 11 15:44:56 CET 2014


In essence: "Yes"

On 11 February 2014 at 15:18, Alessandro Mammana wrote:
| Hi all,
| I got another segfault using Rcpp. It is very difficult to understand
| where it happens and to reduce it to a minimal example, so for now I
| am not posting very precise code here, but I have a suspicion, maybe
| you could help me saying if my suspect is right.

Use a debugger:

    R -d gdb

and then proceed as normal. 

Make sure your compiler flags include -g as well.

Dirk


| I am doing something similar:
| 
| in a .cpp file:
| @@@@@@@@@@@@@@@@@@@
| struct GapMat {
|     int* ptr;
|     int* colset;
|     int nrow;
|     int ncol;
| 
| 
|     inline int* colptr(int col){
|         return ptr + colset[col];
|     }
| 
|     GapMat(){}
| 
|     GapMat(int* _ptr, int* _colset, int _nrow, int _ncol):
|         ptr(_ptr), colset(_colset), nrow(_nrow), ncol(_ncol){}
| };
| 
| 
| // [[Rcpp::export]]
| IntegerVector colSumsGapMat(Rcpp::IntegerVector vec,
| Rcpp::IntegerVector pos, int nrow){
|    GapMat mat(vec.begin(), pos.begin(), nrow, pos.length());
|    IntegerVector res(pos.length());
| 
|     for (int i = 0; i < pos.length(); ++i){
|         for (int j = 0; j < nrow; ++j){
|             res[i] += mat.colptr(i)[j];
|         }
|     }
| 
|     return res;
| }
| @@@@@@@@@@@@@@@@@@@@@
| 
| from R:
| 
| vec <- a very big integer vector
| nrow <- 80
| pos <- a very big subset of positions, such that max(pos) + nrow < length(vec)
| colsums <- colSumsGapMat(vec, pos, nrow)
| 
| 
| from time to time I get a segfault.
| Note: this is not exactly the code that produces the segfault (because
| that one is very complicated), so it might be that this code is
| totally fine.
| 
| My suspicion:
| 
| I am using the pointer "vec.begin()", but then I am allocating new
| memory in the R area of memory with "IntegerVector res(pos.length())"
| and R decides to move the original values of "vec" to some other
| place, making the pointer invalid.
| 
| Is that possible????
| 
| Sorry for being very vague and thx in advance!!!
| Ale
| 
| -- 
| Alessandro Mammana, PhD Student
| Max Planck Institute for Molecular Genetics
| Ihnestraße 63-73
| D-14195 Berlin, Germany
| _______________________________________________
| 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

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


More information about the Rcpp-devel mailing list