Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有退出(1)调用的库的Rcpp 我有一个混合的C[CBLAS]/C++ [库代码]库(由别人开发),我已经在Rcpp包裹。< /P>_C++_Memory Management_Rcpp - Fatal编程技术网

具有退出(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尽可能保持性能(使用
    std::vector
    s是否有问题?)
  • 对库的更改最少,因此更容易从上游进行更新

我建议

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,因此正确解决这一问题可能比您想象的要困难。