带退出(1)调用的库的Rcpp

时间:2014-04-17 10:56:27

标签: c++ memory-management rcpp

我有一个混合的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是一个问题吗?)
  • 对库的最小更改,以便从上游更新

1 个答案:

答案 0 :(得分:4)

我会建议像

这样的东西
if (dataSums == NULL)  Rcpp::stop("Memory allocation failed!\n"); 

无论如何,您的代码都包含try / catch的相应(C ++)图层 如果您使用Rcpp属性,或内联,或者您按照我们多年来提供的示例手动执行。并且考虑到C ++异常层,您可以使用它。

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