Xem xét 1) một lớp tùy chỉnh có khả năng in bộ nhớ lớn và 2) hàm cấp cao nhất thực hiện một số tiền xử lý, sau đó tạo và trả về một đối tượng mới của lớp tùy chỉnh của chúng tôi. Để tránh sao chép không cần thiết theo giá trị, hàm phân bổ đối tượng và trả về một con trỏ cho nó.
Dựa trên một cuộc thảo luận trước đó , có vẻ như cách thích hợp để trả lại một con trỏ cho một đối tượng mới được tạo là bọc nó lại Rcpp::XPtr<>
. Tuy nhiên, R sau đó thấy nó hiệu quả như externalptr
, và tôi đang vật lộn để tìm ra cách thức phù hợp để đúc nó với cách làm hiện đại RCPP_EXPOSED_CLASS
và RCPP_MODULE
cách làm.
Thay thế là trả về con trỏ thô. Nhưng sau đó tôi không chắc chắn 100% rằng bộ nhớ đối tượng được dọn sạch đúng cách. Tôi đã chạy valgrind
để kiểm tra rò rỉ bộ nhớ và nó không tìm thấy. Tuy nhiên, ai làm sạch? 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")
;
}
Trong R
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
Câu hỏi của tôi là liệu Rcpp::Xptr<>
cách trả về con trỏ thích hợp, và nếu vậy, làm thế nào để tôi có được R để xem kết quả như thế nào Double
, không externalptr
? Ngoài ra, nếu trả về một con trỏ thô không gây ra vấn đề về bộ nhớ, ai sẽ dọn sạch đối tượng mà hàm tạo ra?
CustomClass*
. Ứng dụng thực tế là một cấu trúc dữ liệu tùy chỉnh không có R tương đương và tất cả các tương tác được thực hiện thông qua chức năng được hiển thị bởi RCPP_MODULE
. Trận đấu gần nhất mà tìm kiếm động lực của tôi tìm thấy là một bài đăng từ 7 năm trước , trong đó dường như tôi cần xác định một trình template <> CustomClass* as()
chuyển đổi. Tuy nhiên, tôi không rõ ràng về cách nó nên tương tác RCPP_MODULE
và RCPP_EXPOSED_CLASS
, đặc biệt là vì tôi nghĩ cái sau đã được xác định wrap()
và as()
.
RCPP_EXPOSED_CLASS
và RCPP_MODULE
thực sự là cách để làm điều đó? Tôi chưa bao giờ sử dụng hoặc thấy điều đó trước đây.
Rcpp::XPtr
tạo một con trỏ bên ngoài từ mã C ++. Và bạn muốn bỏ nó làmdouble *
hoặc bất cứ trọng tải của bạn là gì. Cần có những ví dụ ở đây, tại Thư viện, tại GitHub ... Có lẽ với một tìm kiếm có động lực, bạn có thể tìm thấy thứ gì đó đủ gần?