11

オブジェクトを C++ に渡すときに、R のガベージ コレクションに問題があります。

次のシナリオがあります。

  1. Rで無名関数を作成し、それをC++コードに渡します(経由.Call()
  2. C++ コードは、後で使用するために R 関数オブジェクトを (SEXP型として) 格納し、戻り値を返します。
  3. 後で、他のC++コードがR関数オブジェクトを呼び出すR_tryEval()

手順 2 と 3 の間で、R 関数オブジェクトが R によってガベージ コレクションされているように見えます。これはR_tryEval()、有効な R 関数オブジェクトをもはや表していない何かを実行しようとするため、クラッシュにつながります。関数オブジェクトがまだ使用中であることをRに伝えるために何もしていないので、それは公平です...

それを念頭に置いて:

  • C++コードから、R関数オブジェクトを使用中としてマークする方法はありますか(gcされないように)?
  • または、C++ コード内で R 関数オブジェクトを複製し、呼び出し後に手動で破棄する安全な方法はありますR_tryEval()か?

(私が理解している限り、PROTECT()/UNPROTECT()マクロはここではオプションではありません。なぜなら、それらは同じスコープ内でバランスをとることが想定されているためです。同様にPROTECT()、関数が最初に C++ に渡されたときに呼び出すUNPROTECT()ことはできません。実行されました。)

4

1 に答える 1

3

探していると思います

/* preserve objects across GCs */
void R_PreserveObject(SEXP);
void R_ReleaseObject(SEXP);

R_internals.h ヘッダーにあります。

于 2012-06-15T23:23:28.010 に答える