当使用R包装器时,R垃圾收集器是否释放在C中分配的内存?

时间:2015-06-01 16:04:15

标签: c r memory memory-leaks

我正在为C代码使用R包装器。在小规模的运行中,一切似乎都很顺利,但我在本周末进行了更长时间的分析,我得到了我认为的内存泄漏问题。我收到了消息:

  

Mac OS X启动盘没有更多可用于应用程序内存的空间,我不得不重启机器。

我假设我理解正确并且我有内存泄漏。了解R和C如何管理内存将有助于我了解内存泄漏的位置。我的问题是:

当指针被发送回R时,在C运行期间分配的内存会发生什么?这个内存是由R垃圾收集器释放还是确保直接释放C中的所有内存非常重要?

修改

一些内存空间已直接在R中分配并传递给C.这些是之后返回给R的变量,我怀疑R垃圾收集器会正确管理这个内存。我怀疑可能导致内存泄漏的变量是临时变量,内存在C中分配,malloccalloc并且不会返回给R。

1 个答案:

答案 0 :(得分:1)

除非你告诉它,否则R垃圾收集器不会自动调用C free

例如,如果你有一个C函数,让我们称之为“allocator”,它返回一个带有相关内存的指针:

varA <- .Call("allocator", 1000)  #Allocate 1000 bytes
doProcess(varA) #...

varA <- .Call("allocator", 1000)  #Allocate 1000 bytes again
 #varA is overwritten, so R is going to try to call the object destructor

问题是“allocator”对象没有定义的析构函数。做到这一点的方法是:

varA <- .Call("allocator", 1000)  #Allocate 1000 bytes
#let's tell R what to do in the garbage collection process:
reg.finalizer(varA, function(x){
                      .Call("deAllocator", x)
                      })
doProcess(varA) #...

varA <- .Call("allocator", 1000) #Allocate 1000 bytes again
#varA is overwritten, so R is going to call "deAllocator" 

“deAllocator”函数必须在C中定义,它应该从指针中释放内存。