Ruby 如果我';我要自己释放记忆?

Ruby 如果我';我要自己释放记忆?,ruby,ruby-c-extension,Ruby,Ruby C Extension,发件人: 有时,您可能需要在扩展中分配内存,而扩展不需要 用于对象存储也许你有一个巨大的Bloom位图 过滤器,一个图像,或是一堆Ruby使用的小结构 不直接使用。要正确使用垃圾收集器, 您应该使用以下内存分配例程。这些 例程做的工作比标准malloc函数多一点。 例如,如果ALLOC_N确定它无法分配 所需的内存量,它将调用垃圾收集器进行尝试 回收一些空间。如果不能或 请求的内存量无效 但在给定的函数中,我确切地知道何时释放内存。在这种情况下,我是否仍应使用ALLOC\N分配内存 我应该自己释

发件人:

有时,您可能需要在扩展中分配内存,而扩展不需要 用于对象存储也许你有一个巨大的Bloom位图 过滤器,一个图像,或是一堆Ruby使用的小结构 不直接使用。要正确使用垃圾收集器, 您应该使用以下内存分配例程。这些 例程做的工作比标准malloc函数多一点。 例如,如果ALLOC_N确定它无法分配 所需的内存量,它将调用垃圾收集器进行尝试 回收一些空间。如果不能或 请求的内存量无效

但在给定的函数中,我确切地知道何时释放内存。在这种情况下,我是否仍应使用
ALLOC\N
分配内存


我应该自己释放内存,还是最好总是使用
ALLOC\N
而不关心它?

您可能应该使用
ALLOC\N
来动态管理内存分配,其中您的C代码需要独立于对象数据存储东西,并且存储的数据需要在多个方法调用中持久化(因此您无法确定是否会调用特定C函数中的释放)

如果您只是在一个复杂方法调用的上下文中创建一些东西,然后将其丢弃,那么您可以使用纯C方法进行内存管理。C堆栈适合于真正的基础知识,例如只需声明
intfoo[1000],您可以在内部使用该数组,C将使用堆栈并像正常情况一样进行清理-Ruby当然无法访问该数据,除非您在最后将其复制到某个文件中。但是不要过度使用这个,
intfoo[1000000]有可能损坏堆栈并导致SEG故障


该文档暗示了使用
ALLOC\N
的另一个原因-您将避免由于调用垃圾收集而出现内存不足的情况。此外,如果内存确实不足,那么Ruby管理的进程会出现稍微友好的故障(与C例程的操作相反)。

您可能应该使用
ALLOC\N
来动态管理内存分配,其中C代码需要独立于对象数据存储东西,并且存储的数据需要在多个方法调用中持久化(因此您无法确定是否会调用特定C函数中的释放)

如果您只是在一个复杂方法调用的上下文中创建一些东西,然后将其丢弃,那么您可以使用纯C方法进行内存管理。C堆栈适合于真正的基础知识,例如只需声明
intfoo[1000],您可以在内部使用该数组,C将使用堆栈并像正常情况一样进行清理-Ruby当然无法访问该数据,除非您在最后将其复制到某个文件中。但是不要过度使用这个,
intfoo[1000000]有可能损坏堆栈并导致SEG故障


该文档暗示了使用
ALLOC\N
的另一个原因-您将避免由于调用垃圾收集而出现内存不足的情况。此外,如果内存确实不足(与C例程的操作相反),那么Ruby管理的进程会出现稍微友好一些的故障。

ALLOC\N
不会释放分配的内存。如果第一次尝试分配内存失败,它将触发GC以释放更多内存,然后重试


您仍然应该释放
ALLOC\N
分配的内存。但是使用
xfree
而不是
free
——不幸的是,这在指南中没有很好地描述,但是您发现它在Ruby源代码和其他Ruby C扩展的源代码中使用。

ALLOC\N
不会释放您分配的内存。如果第一次尝试分配内存失败,它将触发GC以释放更多内存,然后重试


您仍然应该释放
ALLOC\N
分配的内存。但是使用
xfree
而不是
free
——不幸的是,在诸如但你发现它在Ruby源代码和其他Ruby C扩展的源代码中没有得到很好的描述。解释C扩展的好博客:更新的功能可能是使用
Ruby\u xfree
。解释C扩展的好博客:更新的函数可能是使用
ruby\u xfree