具有出口(1)调用的库的Rcpp

Rcpp for library with exit(1) calls

本文关键字:调用 Rcpp 出口      更新时间:2023-10-16

我有一个混合的C[cblas]/C++[库代码]库(由其他人开发),我已经在Rcpp中封装了它。

许多方法都有如下代码:

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

无论如何,您的代码中都有相应的try / catch(C++)层如果您使用Rcpp属性,或者内联,或者按照我们多年来提供的示例手动执行。如果有C++异常层,你可以直接使用它

如果您的代码层需要额外的清理,您可以在那里添加该层。但是C++数据结构将被适当地展开。