在我的 R 包中,实现该函数的 C 代码分配了一些内存供使用。这段记忆会发生什么?它会在 R 的 GC 的雷达下还是内存泄漏?如果它在 R 的垃圾收集下,这块内存会被回收吗?
我在作为服务器运行的 R 的服务器进程中分配了 5 GB 的巨大数据。在这里,如果我可以像我们在 Java 中分配外部堆内存一样,从 GC 的雷达中分配这些内存,那将是一个好主意。所以基本上,我可以在我的 C 代码中分配大量内存而 R 不会干扰该内存吗?
我打算使用 malloc 或 calloc 来分配内存。
在我的 R 包中,实现该函数的 C 代码分配了一些内存供使用。这段记忆会发生什么?它会在 R 的 GC 的雷达下还是内存泄漏?如果它在 R 的垃圾收集下,这块内存会被回收吗?
我在作为服务器运行的 R 的服务器进程中分配了 5 GB 的巨大数据。在这里,如果我可以像我们在 Java 中分配外部堆内存一样,从 GC 的雷达中分配这些内存,那将是一个好主意。所以基本上,我可以在我的 C 代码中分配大量内存而 R 不会干扰该内存吗?
我打算使用 malloc 或 calloc 来分配内存。
这在“编写 R 扩展”中得到了相当清楚的描述——一个使用calloc()
/的 R 变体malloc()
访问相同的内存池。这样 R 可以gc()
做这些事情,以及为什么需要PROTECT()
and 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
当不再需要时,用户应该安排到这个内存,包括错误或用户中断。这通常可以通过on.exit
调用 R 函数中的操作最方便地完成 - 请参阅pwilcox
示例。不要假设
Calloc
/分配的内存与 :Realloc
使用的内存来自同一个池malloc
:特别是不要使用free
或strdup
与它一起使用。这些入口点需要以
R_
ifSTRICT_R_HEADERS
已定义为前缀。
来自钱伯斯的数据分析软件:
每当任何计算可能动态分配 R 存储并且结果未在 R 级别分配时,必须使用 PROTECT 和 UNPROTECT 宏来保护相应 C 引用的使用。原因是存储会在 R 中被释放,而在计算过程中碰巧对动态存储进行了垃圾收集。