R语言中C函数分配的内存会发生什么变化

时间:2012-12-07 11:14:24

标签: r memory-management garbage-collection package

在我的R包中,实现该函数的C代码为使用分配了一些内存。 这段记忆怎么了? 它会在R的GC雷达之下还是内存泄漏? 如果它在R的垃圾收集下,这个内存会被回收吗?

我在R的服务器进程中分配了大量5 GB的数据,该进程作为服务器运行。 如果我可以从GC的雷达中分配这个内存,就像我们在Java中使用外部堆内存分配一样,这将是个好主意。 所以基本上,我可以在我的C代码中分配大量内存,而不会损坏内存吗?

我打算使用malloc或calloc来分配内存。

2 个答案:

答案 0 :(得分:3)

在“编写R扩展”中相当清楚地描述了这一点 - 使用calloc() / malloc()的R变体来访问相同的内存池。这样R可以gc()这些东西,以及为什么你需要PROTECT()UNPROTECT()

  

6.1.2用户控制的存储器

     

另一种形式的内存分配是malloc的接口   提供R错误处理的界面。这种记忆持续到释放   由用户提供并且是为R分配的内存的附加内容   工作区。

     

界面功能

 TYPE* Calloc(size_t N, TYPE)
 TYPE* Realloc(ANY *P, size_t N, TYPE)
 void Free(ANY *P)
     

提供callocreallocfree的类似物。如果有的话   分配期间的错误由R处理,所以如果这些例程   返回内存已成功分配或释放。 Free   将指针P设置为NULL。 (有些但不是所有版本的S都有   如此。)

     

用户在不再需要时应安排Free此内存,   包括错误或用户中断。这通常可以做到最多   方便地从调用R函数中的on.exit动作 - 参见   pwilcox举个例子。

     

不要假设Calloc / Realloc分配的内存来了   来自malloc使用的同一个池:特别是不使用   <{1}}或free。{/ p>      

这些入口点需要以strdup为前缀   已定义R_

答案 1 :(得分:0)

来自钱伯斯的数据分析软件

  

每当任何计算都可能动态分配R存储时   并且结果未在R级分配,使用了   相应的C引用必须受PROTECT保护   UNPROTECT宏。原因是存储本来就是   在R中发布的事件发生了动态存储的垃圾收集   在计算过程中。