Использование деструктора RInside

Простой эксперимент показывает, что в каждый поток одновременно допускается только один экземпляр 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?


person Alexey Lakhno    schedule 03.09.2012    source источник


Ответы (1)


Пожалуйста -- все это только что обсуждалось в списке рассылки rcpp-devel а вот ссылка на всю (короткую) ветку. Короче говоря, это не деструктор RInside, а скорее сам R API, который RInside просто предоставляет через более простую в использовании оболочку C++.

Дополнительное сообщение также было отправлено в r-devel и в этой ветке Саймон ясно заявляет, что из-за ряда статических глобальных переменных в самом R исправление маловероятно.

person Dirk Eddelbuettel    schedule 03.09.2012