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

Does R garbage collector frees memory allocated in C when using a R wrapper?

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

Mac OS X startup disk has no more space available for application memory and I had to restart the machine.

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

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

编辑

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

R 垃圾收集器不会自动调用 C 的 free,除非您告诉它。

例如,如果您有一个 C 函数,我们称它为 "allocator",其中 returns 是一个具有关联内存的指针:

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" 

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