1) সম্ভাব্য বৃহত মেমরি প্রিন্ট সহ একটি কাস্টম শ্রেণি এবং 2) একটি শীর্ষ-স্তরের ফাংশন যা কিছু প্রাক প্রসেসিং সম্পাদন করে, তারপরে আমাদের কাস্টম শ্রেণীর একটি নতুন অবজেক্ট তৈরি করে এবং ফেরত দেয়। মান দ্বারা অপ্রয়োজনীয় অনুলিপি এড়ানোর জন্য, ফাংশনটি বস্তুকে বরাদ্দ দেয় এবং পরিবর্তে এটিতে একটি পয়েন্টার দেয় returns
পূর্ববর্তী আলোচনার ভিত্তিতে , মনে হয় সদ্য তৈরি হওয়া কোনও বস্তুতে পয়েন্টার ফিরিয়ে দেওয়ার সঠিক উপায়টি এটি দিয়ে মোড়ানো Rcpp::XPtr<>
। যাইহোক, আর এরপরে এটিকে কার্যকরভাবে হিসাবে দেখবে externalptr
এবং আমি আধুনিক RCPP_EXPOSED_CLASS
ও কাজের RCPP_MODULE
পদ্ধতিতে এটি কাস্ট করার সঠিক উপায় খুঁজে পেতে লড়াই করছি ।
বিকল্পটি হল কাঁচা পয়েন্টারটি ফিরিয়ে দেওয়া। তবে আমি 100% নির্দিষ্ট নই যে অবজেক্টের মেমরিটি সঠিকভাবে পরিষ্কার হয়ে যায়। আমি valgrind
মেমরি ফাঁস পরীক্ষা করার জন্য দৌড়েছি , কিন্তু এটির কোনও সন্ধান পেল না। তবে কে সাফ করে? আর?
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")
;
}
আর
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
আমার প্রশ্নটি হল যে Rcpp::Xptr<>
পয়েন্টারগুলি ফেরানোর উপযুক্ত উপায় কিনা এবং যদি তাই হয়, তবে আমি কীভাবে আর দেখতে পাব, ফলাফলটি Double
নয় externalptr
? বিকল্পভাবে, যদি কোনও কাঁচা পয়েন্টার ফিরিয়ে দেওয়া মেমরির সমস্যার কারণ না করে তবে ফাংশনটি তৈরি করে এমন বস্তু কে সাফ করে?
CustomClass*
। আসল অ্যাপ্লিকেশন হ'ল একটি কাস্টম ডেটা স্ট্রাকচার যা কোনও আর সমতুল্য নয় এবং সমস্ত ইন্টারঅ্যাকশনগুলি দ্বারা প্রকাশিত কার্যকারিতার মাধ্যমে সম্পন্ন হয় RCPP_MODULE
। আমার অনুপ্রাণিত অনুসন্ধানের সন্ধান পাওয়া সবচেয়ে নিকটতম মিলটি 7 বছর আগের একটি পোস্ট ছিল যেখানে মনে হয় যে আমার কোনও template <> CustomClass* as()
রূপান্তরকারী সংজ্ঞায়িত করা দরকার । তবে এটির সাথে কীভাবে ইন্টারঅ্যাক্ট করা উচিত RCPP_MODULE
এবং RCPP_EXPOSED_CLASS
আমি বিশেষত যেহেতু আমি ভেবেছিলাম যে পরেরটি ইতিমধ্যে সংজ্ঞায়িত হয়েছে wrap()
এবং as()
।
RCPP_EXPOSED_CLASS
এবং RCPP_MODULE
এটি করার উপায় কি? আমি এর আগে কখনও ব্যবহার বা দেখিনি।
Rcpp::XPtr
সি ++ কোড থেকে একটি বাহ্যিক পয়েন্টার তৈরি করতে চান । এবং আপনি এটি করতে চানdouble *
বা আপনার পেডলোড যা-ই হোক না কেন cast এখানে গ্যালারিতে, গিটহাবের উদাহরণ থাকতে হবে ... একটি অনুপ্রাণিত অনুসন্ধানের সাহায্যে আপনি যথেষ্ট পরিমাণে কিছু খুঁজে পেতে পারেন?