在我的R包中,实现该函数的C代码为使用分配了一些内存。 这段记忆怎么了? 它会在R的GC雷达之下还是内存泄漏? 如果它在R的垃圾收集下,这个内存会被回收吗?
我在R的服务器进程中分配了大量5 GB的数据,该进程作为服务器运行。 如果我可以从GC的雷达中分配这个内存,就像我们在Java中使用外部堆内存分配一样,这将是个好主意。 所以基本上,我可以在我的C代码中分配大量内存,而不会损坏内存吗?
我打算使用malloc或calloc来分配内存。
答案 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)
提供
calloc
,realloc
和free
的类似物。如果有的话 分配期间的错误由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中发布的事件发生了动态存储的垃圾收集 在计算过程中。