1) potansiyel olarak büyük bir bellek baskısı olan özel bir sınıf ve 2) bazı ön işlem gerçekleştiren, daha sonra özel sınıfımızın yeni bir nesnesini oluşturan ve döndüren üst düzey bir işlev düşünün. Değere göre gereksiz kopyalamayı önlemek için işlev, nesneyi ayırır ve onun yerine bir işaretçi döndürür.
Önceki bir tartışmaya dayanarak, yeni oluşturulmuş bir nesneye bir işaretçiyi döndürmenin uygun yolunun onu kaydırmak olduğu anlaşılıyor Rcpp::XPtr<>. Bununla birlikte, R daha sonra etkili bir şekilde görür externalptrve onu modern RCPP_EXPOSED_CLASSve bir RCPP_MODULEşeyler yapmanın yolunu bulmak için uygun yolu bulmakta zorlanıyorum .
Alternatif ham işaretçiyi döndürmektir. Ama sonra nesne belleğinin düzgün bir şekilde temizlendiğinden% 100 emin değilim. valgrindBellek sızıntılarını test etmek için koştum ve hiçbir şey bulamadı. Ancak, temizlik kim yapar? R?
test.cpp
#include <Rcpp.h>
// Custom class
class Double {
public:
Double( double v ) : value(v) {}
double square() {return value*value;}
private:
double value;
};
// Make the class visible
RCPP_EXPOSED_CLASS(Double)
// Option 1: returning raw pointer
Double* makeDouble( double x ) {
Double* pd = new Double(x);
return pd;
}
// Option 2: returning XPtr<>
SEXP makeDouble2( double x ) {
Double* pd = new Double(x);
Rcpp::XPtr<Double> ptr(pd);
return ptr;
}
RCPP_MODULE(double_cpp) {
using namespace Rcpp;
function( "makeDouble", &makeDouble );
function( "makeDouble2", &makeDouble2 );
class_<Double>("Double")
.constructor<double>("Wraps a double")
.method("square", &Double::square, "square of value")
;
}
R cinsinden
Rcpp::sourceCpp("test.cpp")
d1 <- makeDouble(5.4) # <-- who cleans this up???
# C++ object <0x56257d628e70> of class 'Double' <0x56257c69cf90>
d1$square()
# 29.16
d2 <- makeDouble2(2.3)
# <pointer: 0x56257d3c3cd0>
d2$square()
# Error in d2$square : object of type 'externalptr' is not subsettable
Benim sorum Rcpp::Xptr<>işaretçiler döndürmek için uygun bir yol olup olmadığını , ve eğer öyleyse, R, sonucu olarak Doubledeğil görmek için nasıl alabilirim externalptr? Alternatif olarak, ham işaretçiyi döndürmek bellek sorunlarına neden olmazsa, işlevin oluşturduğu nesneyi kim temizler?
CustomClass*. Gerçek uygulama R eşdeğeri olmayan özel bir veri yapısıdır ve tüm etkileşimler RCPP_MODULE. Motive aramamın bulduğu en yakın eşleşme , 7 yıl önceki bir gönderiydi , burada bir template <> CustomClass* as()dönüştürücü tanımlamam gerekiyor gibi görünüyor . Bununla birlikte, nasıl etkileşime girmesi gerektiği konusunda net değilim RCPP_MODULEve RCPP_EXPOSED_CLASSözellikle ikincisinin zaten tanımlanmış olduğunu düşündüğümden wrap()ve as().
RCPP_EXPOSED_CLASSve RCPP_MODULEgerçekten bunu yapmanın yolu mu? Daha önce hiç kullanmadım veya görmedim.
Rcpp::XPtrC ++ kodundan harici bir işaretçi oluşturmak istiyorsunuz . Ve bunu yapmak istersinizdouble *ya da yükünüz ne olursa olsun. Burada, Galeri'de, GitHub'da örnekler olmalı ... Belki de motive edici bir arama ile yeterince yakın bir şey bulabilirsiniz?