2

オブジェクトファイナライザーを指定すると、この Rcpp モジュールが公開された c++ クラスをコンパイルしないのはなぜですか? 動作するバージョンを提供できますか?

class Exposed{
     public:
        Exposed(){
          printf("constructor has been called\n");
        }

     private:
        int some_field;
}

Rcpp モジュールのチュートリアルから: class_ の .finalizer メンバー関数を使用して、ファイナライザーを登録できます。ファイナライザは、ターゲット クラスへのポインタを取り、void を返す自由な関数です。ファイナライザはデストラクタの前に呼び出されるため、ターゲット クラスの有効なオブジェクトで動作します。操作の実行、リソースの解放などに使用できます... C++ オブジェクトをカプセル化する R オブジェクトがガベージ コレクションされると、ファイナライザーが自動的に呼び出されます。

 static void finalizer_of_exposed( Exposed* ptr ){
      printf("finalizer has been called\n");
 }

 RCPP_MODULE(yada){

    class_<Exposed>("exposed")
        .constructor("")
        .finalizer( &finalizer_of_exposed )    
    ;
 }
4

1 に答える 1

1

voidなしで関数として試しましたstaticか?

編集 2012 年 7 月 21 日: バグが見つかりました! Module.h の 720 行を変更する必要があります。

Index: inst/include/Rcpp/Module.h
===================================================================
--- inst/include/Rcpp/Module.h  (revision 3697)
+++ inst/include/Rcpp/Module.h  (working copy)
@@ -717,7 +717,7 @@
     private:

         void SetFinalizer( finalizer_class* f ){
-            if( class_pointer->finalizer_pointer ) delete class_pointer->finalizer ;
+            if( class_pointer->finalizer_pointer ) delete class_pointer->finalizer_pointer ;
             class_pointer->finalizer_pointer = f ; 
         }

SVNでそれを修正しました。ありがとう!

于 2012-07-19T11:48:33.207 に答える