具有退出(1)调用的库的Rcpp 我有一个混合的C[CBLAS]/C++ [库代码]库(由别人开发),我已经在Rcpp包裹。< /P>
许多方法的代码如下所示:具有退出(1)调用的库的Rcpp 我有一个混合的C[CBLAS]/C++ [库代码]库(由别人开发),我已经在Rcpp包裹。< /P>,c++,memory-management,rcpp,C++,Memory Management,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
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;
}
当然,退出(1)在这里是个问题:当从R调用时,它也会关闭R,这是我不想要的
确保以下各项的最佳方法是什么:
- 出现错误时R不会关闭(替换
退出
异常调用?)
- 之后,内存被正确清理
- cblas尽可能保持性能(使用
s是否有问题?)std::vector
- 对库的更改最少,因此更容易从上游进行更新
if (dataSums == NULL) Rcpp::stop("Memory allocation failed!\n");
无论如何,您的代码都有相应的(C++)层try/catch
如果您使用Rcpp属性或内联属性,或者按照我们多年来提供的示例手动执行。并且给出C++异常层,你可以使用它。
如果您的代码层需要额外的清理,您可以在那里添加该层。但C++数据结构将被正确解开。 < P>我建议类似< /P>
if (dataSums == NULL) Rcpp::stop("Memory allocation failed!\n");
无论如何,您的代码都有相应的(C++)层try/catch
如果您使用Rcpp属性或内联属性,或者按照我们多年来提供的示例手动执行。并且给出C++异常层,你可以使用它。
如果您的代码层需要额外的清理,您可以在那里添加该层。但是C++数据结构将被正确解开。请注意,某些CBLAS实现(例如OpenBLAS)在内存不足时也会退出/
中止
/segfault,因此正确解决这一问题可能比您想象的要困难。请注意,一些CBLAS实现(例如OpenBLAS)在内存不足时也会退出/中止
/segfault,因此正确解决这一问题可能比您想象的要困难。