卸载R包的已编译代码以避免内存泄漏?

时间:2018-08-21 10:49:20

标签: r memory-leaks package r-package

我有一个大型的C程序(无法共享可复制的代码),我想将其包含在R包中,这样用户就不必自己编译它并且它是独立的。因此,编译后的代码部分仅由一个包函数使用,例如

wrapperfoo <- function(config_file_path, output_file_path) {
  #stuff
  #...
  .C("myprogram", config_file_path, output_file_path)
  #... 
}

C代码的问题在于它使用了不会重置的Flex / Bison扫描仪/解析器。代码不是我的,我想避免重写扫描器(C中的简单修复不起作用,包括一些有关SO的主题,例如yylex_destroy(),我是C新手,因此调试很困难。)

如果在R中我在调用程序后卸载该软件包并再次加载,则完全可以。 (如果在R之外编译和运行,效果很好。)

这可行:

library(mypackage)
wrapperfunction()
unloadNamespace("mypackage") #invokes library.dynam.unload()
library(mypackage)
wrapperfunction()

但这不会:

library(mypackage)
wrapperfunction()
wrapperfunction() #parser crashes and with it R

在我的wrapperfunction()中加载和卸载DLL可以吗?在我看来,这违反了R包编写的良好实践,我什至不知道是否可行? 还是在.C之后还有其他函数需要清除?会使用.Call帮助吗? gc()没有帮助

0 个答案:

没有答案