我正在为C代码使用R包装器。在小规模的运行中,一切似乎都很顺利,但我在本周末进行了更长时间的分析,我得到了我认为的内存泄漏问题。我收到了消息:
Mac OS X启动盘没有更多可用于应用程序内存的空间,我不得不重启机器。
我假设我理解正确并且我有内存泄漏。了解R和C如何管理内存将有助于我了解内存泄漏的位置。我的问题是:
当指针被发送回R时,在C运行期间分配的内存会发生什么?这个内存是由R垃圾收集器释放还是确保直接释放C中的所有内存非常重要?
修改
一些内存空间已直接在R中分配并传递给C.这些是之后返回给R的变量,我怀疑R垃圾收集器会正确管理这个内存。我怀疑可能导致内存泄漏的变量是临时变量,内存在C中分配,malloc
或calloc
并且不会返回给R。
答案 0 :(得分:1)
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中定义,它应该从指针中释放内存。