Эта страница http://adv -r.had.co.nz / C-interface.html говорит
, если вы не защищаете каждый созданный вами объект R,сборщик мусора сочтет, что они не используются, и удалит их
. Также приводится пример кода
SEXP result = PROTECT(allocVector(REALSXP, 1));
REAL(result)[0] = asReal(a) + asReal(b);
UNPROTECT(1);
return result;
Если вызовы PROTECT
и UNPROTECT
используются для остановкиОбъекты SEXP не удаляются, если ваш код C выгружен, а сборщик мусора R запущен, тогда пример кода неверен.Если код C здесь прерван между вызовом UNPROTECT
и последним оператором возврата, то result
все равно будет удален, прежде чем он будет возвращен из функции.
Как правильно защититьЗначения SEXP, которые вы выделяете в функциях C api из сборки мусора во время работы кода C?