返回无效值 从Rcpp到R,会出现segfault。

问题描述 投票:1回答:1

我使用Rcpp写了一个C++函数,返回一个 "Nullable<NumericMatrix>`。从R中反复调用这个函数会使我在windows机器上的R会话崩溃,并且当我在Linux服务器上运行它时,会导致一个segfault错误。

NumericMatrix本身是由另一个C++函数生成的,然后 "包装 "在 "Nullable<NumericMatrix>`中。似乎只有在C++函数内部进行了更多的计算,然后才将值返回给R时,才会发生错误。这个错误并不是每次调用C++函数都会发生。但如果我多次调用它,几乎肯定会发生崩溃。

这里有一段代码,一旦我sourceCPP,几乎每次都会崩溃。

#include <Rcpp.h>
using namespace Rcpp;


NumericMatrix fun() {
  NumericMatrix m (10, 10);
  std::fill(m.begin(), m.end(), 42);
  return m;
}

int otherCall() {
  NumericVector v(1000);
  std::fill(v.begin(), v.end(), 7);
  return v.length();
}

// [[Rcpp::export]]
Nullable<NumericMatrix> returnNullableObject(int num_it) {
  Nullable<NumericMatrix> object = R_NilValue;

  object = Nullable<NumericMatrix>(fun());

  for (int i = 0; i < num_it; i++) {
    otherCall();
  }

  return object;
}


/*** R
test <- function(n) {
  val <- returnNullableObject(1000L)
  is.matrix(val)
}

for (i in seq_len(100L)) test()

*/

我是否使用了... Nullable 类错误?在R 3.6.1和R 4.0.1上都会崩溃。

> devtools::session_info()
- Session info ------------------------------------------------------------------------------------------------------------------------------------------------
 setting  value                       
 version  R version 4.0.1 (2020-06-06)
 os       Windows 10 x64              
 system   x86_64, mingw32             
 ui       RStudio                     
 language (EN)                        
 collate  German_Germany.1252         
 ctype    German_Germany.1252         
 tz       Europe/Berlin               
 date     2020-06-16                  

- Packages ----------------------------------------------------------------------------------------------------------------------------------------------------
 package     * version date       lib source        
 assertthat    0.2.1   2019-03-21 [1] CRAN (R 4.0.0)
 backports     1.1.7   2020-05-13 [1] CRAN (R 4.0.0)
 callr         3.4.3   2020-03-28 [1] CRAN (R 4.0.0)
 cli           2.0.2   2020-02-28 [1] CRAN (R 4.0.0)
 crayon        1.3.4   2017-09-16 [1] CRAN (R 4.0.0)
 desc          1.2.0   2018-05-01 [1] CRAN (R 4.0.0)
 devtools      2.3.0   2020-04-10 [1] CRAN (R 4.0.0)
 digest        0.6.25  2020-02-23 [1] CRAN (R 4.0.0)
 ellipsis      0.3.1   2020-05-15 [1] CRAN (R 4.0.0)
 fansi         0.4.1   2020-01-08 [1] CRAN (R 4.0.0)
 fs            1.4.1   2020-04-04 [1] CRAN (R 4.0.0)
 glue          1.4.1   2020-05-13 [1] CRAN (R 4.0.0)
 lattice       0.20-41 2020-04-02 [1] CRAN (R 4.0.1)
 magrittr      1.5     2014-11-22 [1] CRAN (R 4.0.0)
 Matrix        1.2-18  2019-11-27 [1] CRAN (R 4.0.1)
 memoise       1.1.0   2017-04-21 [1] CRAN (R 4.0.0)
 pkgbuild      1.0.8   2020-05-07 [1] CRAN (R 4.0.0)
 pkgload       1.1.0   2020-05-29 [1] CRAN (R 4.0.0)
 prettyunits   1.1.1   2020-01-24 [1] CRAN (R 4.0.0)
 processx      3.4.2   2020-02-09 [1] CRAN (R 4.0.0)
 ps            1.3.3   2020-05-08 [1] CRAN (R 4.0.0)
 R6            2.4.1   2019-11-12 [1] CRAN (R 4.0.0)
 remotes       2.1.1   2020-02-15 [1] CRAN (R 4.0.0)
 rlang         0.4.6   2020-05-02 [1] CRAN (R 4.0.0)
 rprojroot     1.3-2   2018-01-03 [1] CRAN (R 4.0.0)
 rstudioapi    0.11    2020-02-07 [1] CRAN (R 4.0.0)
 sessioninfo   1.1.1   2018-11-05 [1] CRAN (R 4.0.0)
 testthat      2.3.2   2020-03-02 [1] CRAN (R 4.0.0)
 usethis       1.6.1   2020-04-29 [1] CRAN (R 4.0.0)
 withr         2.2.0   2020-04-20 [1] CRAN (R 4.0.0)
r rcpp
1个回答
1
投票

简单的回答是 使用... Nullable<> 只用于功能输入,不用于其他。取代 Nullable<>RObject 修正了这个问题。

RObject returnNullableObject(int num_it) {
  RObject object = R_NilValue;

  object = fun();

  for (int i = 0; i < num_it; i++) {
    otherCall();
  }

  return object;
}

谢谢你的评论和澄清,关于使用 Nullable<>!

© www.soinside.com 2019 - 2024. All rights reserved.