【问题标题】:Rcpp code crashes RRcpp 代码崩溃 R
【发布时间】:2014-01-30 14:16:47
【问题描述】:

我有以下 C++ 代码:

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);
}

我使用 Rcpp 包运行它:sourceCpp("...")。如果z1.size() 小于 500,它会很好地工作。但对于更大的尺寸,它会在打印第二个“toto”之前崩溃并关闭 R。

我想知道:

  • 我在这里做错了吗?
  • 或者 Rcpp 中的这个大小问题是否已知?
  • 有没有办法让我的代码在z1.size() >0 下运行?

谢谢!

【问题讨论】:

  • 是的,正如 Matthew 告诉您的那样,您的代码不正确。我现在添加了一个比他的vector&lt;vector&lt;double&gt; &gt; 更好的解决方案。

标签: c++ r rcpp


【解决方案1】:

比马修说的还要糟糕

 double bb[N][N];

只是错误,因为 C / C++ 没有原生的二维结构。您总是创建一个长向量,然后在其中使用巧妙的索引,参见例如用于模拟矩阵的 C 代码中的旧数值配方。

在这里,这很愚蠢,因为我们确实有矩阵类型,所以使用一个:

 Rcpp::NumericMatrix bb(N,N);

更大的问题是,对于现代 C++ 以及 Rcpp 提供的类,您应该永远必须使用 malloc/freenew/delete

【讨论】:

  • +1 表示从不使用malloc/freenew/delete(资源句柄本身除外)。
  • 是否有任何文档说明为什么 Rcpp 中不需要 malloc/freenew/delete?我问是因为我在仅使用 Rcpp 类的 Rcpp 函数中存在内存泄漏,我正在尝试追踪并修复它。
  • 是的,每个 R 副本附带的 Writing R Extensions 手册。特别强调,对于由 R 管理并返回的对象,您需要从它的池中分配。对于您自己的代码,您可以做任何您想做的事情......然后修复您自己的错误 :) 我的要点是,像 std::vector 这样的 STL 结构使您能够编写代码,而无需像旧 C 中那样管理内存天。
【解决方案2】:

尽管其他人说过,多维数组是完全有效的。但是,仅 C99 支持在运行时指定尺寸。编译器选择尊重这一点,但这不是标准的。这是我使用 clang 和 -pedantic 选项得到的结果:

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];
       ^

另请参阅相关的question

【讨论】:

  • 其实C99的这个“特性”是故意不被C++采用的。请参阅The C++ Programming Language, 4th edition 的第 1.2.3 节。 Stroustrup 称其为“错误特征”。
  • 当然。我同意并期待 dynarray 等.. 但它是不标准的运行时维度。具有编译时间常数维度的多暗淡数组非常好,正如您在回答中所说,发生的事情很可能是堆栈问题
【解决方案3】:

你的问题出在这一行:

double bb[N][N];

这是在堆栈上分配大量元素,而您的堆栈空间已用完。而是在堆上分配。

如果可能,我会为此使用std::vector&lt;std::vector&lt;double&gt;&gt;。那是一个在堆上分配其内存的资源句柄。你没有说明你在用bb做什么,所以我不知道这是否可能。

相关:https://stackoverflow.com/a/16411448/1290634

【讨论】:

  • 为什么?如果需要矩阵,请使用:Rcpp::NumericMatrix bb(N,N);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
相关资源
最近更新 更多