2014-04-17 42 views
1

我有一个混合的C [cblas]/C++ [库代码]库(由其他人开发),我已经包装在Rcpp中。Rcpp for library with exit(1)calls

许多方法都类似下面的代码:

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下来为好,这是我不想要什么。

是什么,以确保最好的办法:(?更换exit电话有例外)

  • R不关机,当发生错误后
  • cblas
  • 内存进行适当的清理尽可能保持性能(使用std::vector s是否有问题?)
  • 对库的更改很少,因此更容易从上游进行更新
+0

呃。请注意,一些CBLAS实现(例如OpenBLAS)在内存不足时也会“退出”/“中止”/ segfault,因此正确解决此问题可能比您想象的要困难。 –

回答

4

我建议像

if (dataSums == NULL) Rcpp::stop("Memory allocation failed!\n"); 

你有相应的(C++)的try/catch一层裹住你的代码反正 如果使用RCPP属性,或内联,或当你做手工下面的例子我们多年来一直提供。给定C++异常层,你可以使用它。

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

相关问题