Rcpp code crashes R

I have the following C++ code :

NumericVector testFromontcpp(NumericMatrix z1, NumericMatrix z2, int Nbootstrap){
  int dim1 = z1.nrow();
  int dim2 = z2.nrow();
  int dimension = z1.ncol();
  int N = dim1 + dim2;
  NumericVector TKeps(Nbootstrap+1);
  cout << "toto";
  double bb[N][N];
  cout << "toto";
  return(TKeps);
}

I run it with Rcpp package : sourceCpp("..."). It works well if z1.size() is under 500. But for higher sizes, it crashes and closes R before the second "toto" is printed.

I would like to know :

  • Am I doing something wrong here ?
  • Or is this issue of size in Rcpp known ?
  • Is there a solution to make my code run with z1.size() >0 ?

Thank you !

Answers


It is even worse than Matthew says as

 double bb[N][N];

is simply wrong as C / C++ have no native two-dimensional structure. You always create a long vector and then use clever indexing into it, see e.g. the old Numerical Recipes in C code for emulating matrices.

Here, this is plain silly as we do have matrix types, so use one:

 Rcpp::NumericMatrix bb(N,N);

The bigger isue that with modern C++, as well as the classes provided by Rcpp, you should never have to use malloc/free or new/delete.


Despite what others have said, multi dimensional arrays are perfectly valid. However, specifying the dimensions at runtime is only supported in C99. Compilers choose to honour that, but it is not standard. Here is what I get with clang and the -pedantic option:

array.cpp:13:15: warning: variable length arrays are a C99 feature [-Wvla-extension]
  double bb[N][N];
              ^
array.cpp:13:12: warning: variable length arrays are a C99 feature [-Wvla-extension]
  double bb[N][N];
       ^

See also this question which is related.


Your problem is in this line:

double bb[N][N];

That is allocating a large number of elements on the stack, and you're running out of stack space. Allocate on the heap instead.

If possible, I would use a std::vector<std::vector<double>> for this. That is a resource handle that allocates its memory on the heap. You don't indicate what you're doing with bb, so I can't tell whether it is possible.

Related: https://stackoverflow.com/a/16411448/1290634


Need Your Help

C++ - How to inform that a data field is not used or set?

c++ data-structures

I have an std::vector&lt;T&gt; where T is a type composed of small numeric fields such as ints or floats; let's say that I have a total of 4 fields for my T, so for example in T I have an int, a ui...

Angularjs form with "name" attribute set, ignores default values

forms validation angularjs angularjs-directive default-value

To validate a form in Angularjs, the "name" attribute needs to be set on the form. When the "name" attribute is set, setting default values in the controller won't work anymore.