2017-08-29 83 views
2

假設一個我在C++以下2個功能:傳遞一個C++對象的指針的回用另一種功能在RCPP

// [[Rcpp::export]] 
SEXP foo() { 

    int a = 1; 

    Rcpp::XPtr<int> ptr(&a, true); 

    return ptr; 
} 

// [[Rcpp::export]] 
int bar(SEXP a){ 

    Rcpp::XPtr<int> x(a); 
    int b = *x; 

    return b; 
} 

我想能夠調用像在R. 以下當然,在這個例子中,我可以在foo中返回一個int到R,但在我的原始代碼中,a是一個有點複雜的數據結構,我不想只返回指向它的指針,所以它可以被其他C++重用函數bar

a <- foo() 
bar(a) 

在這個例子中,我預計bar(a)返回1而不是0.我該如何解決這個問題?

回答

5

一旦函數在foo中完成,您的初始變量a就會超出範圍。相反,您需要首先初始化指針,將其分配,然後用XPtr進行包裝。以下顯示瞭如何執行此操作的示例。

// [[Rcpp::export]] 
SEXP foo() { 

    int *a = new int(1); 

    Rcpp::XPtr<int> ptr(a); 

    return ptr; 
} 

R代碼裏面

Rcpp::sourceCpp('test.cpp') 

a <- foo() 
bar(a) 
[1] 1 
+0

尼斯。儘管技術上它也顯示泄漏,因爲你從不處理'a'。 :) –

+0

@DirkEddelbuettel我認爲'XPtr'註冊終結器刪除對象? – cdeterman

+0

剛剛檢查過,你是對的。很好的功能:) –

相關問題