2014-04-17 74 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++數據結構將被正確解開。

相關問題