【问题标题】:Does R garbage collector frees memory allocated in C when using a R wrapper?使用 R 包装器时,R 垃圾收集器是否会释放 C 中分配的内存?
【发布时间】:2015-06-01 16:04:15
【问题描述】:

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

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

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

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

编辑

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

【问题讨论】:

标签: c r memory memory-leaks


【解决方案1】:

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

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

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

问题是“分配器”对象没有定义析构函数。方法是:

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 中定义,它应该从指针中释放内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多