c++ - 带有 exit(1) 调用的库的 Rcpp

标签 c++ memory-management rcpp

我有一个包含在 Rcpp 中的混合 C [cblas]/C++ [库代码] 库(由其他人开发)。

许多方法的代码如下:

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::vectors 有问题吗?)
  • 对库的更改最少,因此更容易从上游更新

最佳答案

我会建议类似的东西

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

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

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

关于c++ - 带有 exit(1) 调用的库的 Rcpp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23131268/

相关文章:

c++ - 如何移动数组中的字符?

C++ 使用继承为对象分配空间

php - PHP 内存泄漏的常见原因是什么?

Java input = ""与 input = null 不同吗?

c++ - 使用 Rcpp 进行 vector 回收

c++ - 为什么这个模板函数调用在这个函数内部不起作用?

c++ - 函数需要访问另一个函数中的变量

C++:修改一个类在另一个类中的私有(private)属性

r - 用 Rcpp 更慢地优化 R 目标函数,为什么?

r - 在 Windows 上的 parLapply 中使用 Rcpp 函数