我有一个包含在 Rcpp 中的混合 C [cblas]/C++ [库代码] 库(由其他人开发)。
许多方法的代码如下:
void myclass::calculate() {
double* dataSums = (double*) calloc(N, sizeof(double));
if(dataSums == NULL) { printf("Memory allocation failed!\n"); exit(1); }
// do some calculations ...
cblas_dgemm(...);
free(dataSums); dataSums = NULL;
}
当然,exit(1)
在这里是个问题:当从 R 调用时,它也会关闭 R,这是我不想要的。
确保以下内容的最佳方法是什么:
- R 在发生错误时不会关闭(用异常替换
exit
调用?) - 在 之后正确清理了内存
- cblas 尽可能保持高性能(使用
std::vector
s 有问题吗?) - 对库的更改最少,因此更容易从上游更新
最佳答案
我会建议类似的东西
if (dataSums == NULL) Rcpp::stop("Memory allocation failed!\n");
你有相应的 (C++) 层 try/catch
包裹着你的代码
如果您使用 Rcpp 属性或内联,或者当您按照我们多年来提供的示例手动执行时。鉴于 C++ 异常层,您可以直接使用它。
如果您的代码层需要额外清理,您可以在那里添加该层。但是 C++ 数据结构将被正确展开。
关于c++ - 带有 exit(1) 调用的库的 Rcpp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23131268/