2

簡単な実験では、スレッドごとに一度に 1 つの RInside インスタンスのみが許可されることが示されています。

#include <RInside.h>

int main() {
  RInside R1;
  R1.parseEval("cat('Hello, R1\n')");
  RInside R2;
  R2.parseEval("cat('Hello, R2\n')");
  return 0;
}

次の出力でプログラムがクラッシュします。

Hello, R1
terminate called after throwing an instance of 'std::runtime_error'
what():  can only have one RInside instance

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

ただし、RInside インスタンスを連続して作成する別の実験の結果は、あまり明確ではありません。

#include <RInside.h>

int main() {
  RInside *R1 = new RInside();
  R1->parseEval("cat('Hello, R1\n')");
  delete R1;
  RInside *R2 = new RInside();
  R2->parseEval("cat('Hello, R2\n')");
  delete R2;
  return 0;
}

このプログラムは、R2 作成の瞬間にバズります。前の出力は次のようになります。

Hello, R1
Lost warning messages

R1 デストラクタ呼び出しは、適切な RInside クリーンアップに十分ではありませんか?

4

1 に答える 1

3

お願いします -- これはすべて rcpp-devel メーリング リストで議論されたばかりで、ここに (短い) スレッド全体へのリンクがあります。簡単に言えば、これはRInside デストラクタではなく、RInside が使いやすい C++ ラッピングを介して提供するだけ の R API そのものです。

フォローアップの投稿が r-devel にも送信され、そのスレッドで Simon は、R 自体に多数の静的グローバルがあるため、修正の可能性は低いと明確に述べています。

于 2012-09-03T13:26:02.547 に答える