我遇到了与 Rcpp 接口的 c++ 代码可能存在内存问题。我可以想出以下最小的测试用例:
测试.R:
require(Rcpp)
sourceCpp("test.cpp")
N <- 698153
testCpp(N)
测试.cpp:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
void testCpp(int N) {
double closestLandmarks[N];
int closestLandmarksIdx[N];
IntegerVector l(10);
// Fill the double and int vectors
for (int j = 0; j < N; j++) {
closestLandmarks[j] = 1;
closestLandmarksIdx[j] = 2;
} // j
return;
}
运行Rscript test.R
导致堆栈溢出:Error: segfault from C stack overflow
. 基本上,这段代码分配了两个大小为 N 的数组(不管它们是 int 还是 double,它们都会以同样的方式崩溃),实例化一个大小为 10 的 IntegerVector,并填充数组的前 2 个位置。我基本上可以在这里删除任何行,它不会崩溃。它也不会在 N < 698153 时崩溃(这个关键数字因机器而异...... 500000 似乎总是安全的,而 1e6 到处崩溃)。如果我只迭代直到 j < 2 而不是 j < N,它就会崩溃,即当它尝试填充数组的第二个位置时。
我不太明白为什么我会遇到 2 个我认为相当小(< 106)和非常小的 IntegerVector 的数组的内存问题。我的机器有足够的空闲 RAM(24GB 中的 5GB),我可以在 R 中使用更大的向量/矩阵而没有任何问题。
我显然在这里遗漏了一些非常愚蠢的东西。我的代码有什么问题?