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 externalptr
ve onu modern RCPP_EXPOSED_CLASS
ve 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. valgrind
Bellek 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 Double
değ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_MODULE
ve RCPP_EXPOSED_CLASS
özellikle ikincisinin zaten tanımlanmış olduğunu düşündüğümden wrap()
ve as()
.
RCPP_EXPOSED_CLASS
ve RCPP_MODULE
gerçekten bunu yapmanın yolu mu? Daha önce hiç kullanmadım veya görmedim.
Rcpp::XPtr
C ++ 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?