2017-08-29 1 views
2

a Ich habe folgende 2-Funktionen in C Angenommen ++:Pass eine C++ Objekt als Zeiger eine Wiederverwendung in einer anderen Funktion in 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; 
} 

ich so etwas wie die folgenden in R. anrufen können, wollen natürlich, ich könnte eine int bis R in foo, aber in meiner ursprünglichen Code in diesem Beispiel zurückkehren, ist a eine etwas komplexe Datenstruktur, und ich wan't nur den Zeiger auf diese zurück, so kann sie von einem anderen C++ wiederverwendet werden Funktion genannt bar

a <- foo() 
bar(a) 

In diesem Beispiel habe ich erwartet, dass bar(a) 1 anstelle von 0 zurückgegeben hat. Wie kann ich das beheben?

Antwort

5

Ihre Ausgangsvariable a endet, sobald die Funktion in foo endet. Stattdessen müssen Sie zuerst den Zeiger initialisieren, zuweisen und dann mit XPtr umschließen. Im Folgenden wird ein Beispiel für die Vorgehensweise gezeigt.

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

    int *a = new int(1); 

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

    return ptr; 
} 

R Code

Rcpp::sourceCpp('test.cpp') 

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

Nizza. Obwohl es technisch gesehen auch ein Leck zeigt, gibt es kein 'a'. :) –

+0

@DirkEddelbuettel Ich dachte 'XPtr' registriert einen Finalizer um das Objekt zu löschen? – cdeterman

+0

Nur überprüft, und Sie haben Recht. Schönes Feature zu haben :) –

Verwandte Themen