2013-05-06 58 views
1

the pickaxe如果我要自己释放内存,我应该使用ALLOCA_N吗?

有时您可能需要在扩展塔牛逼分配内存不会 用于对象存储,或许你有一个布隆过滤 ,图像,或一个巨大的位图红宝石 没有直接使用的一大堆小结构。要正确使用垃圾回收器, 您应该使用以下内存分配例程。这些例程比standard malloc函数做了更多的工作。 例如,如果ALLOC_N确定它不能分配所需数量的内存,它将调用垃圾回收器来尝试 回收一些空间。如果不能将提高一个NoMemError或者 所请求的内存量是无效的

但在一个给定的功能,我确切地知道何时释放内存。在这种情况下,我应该仍然使用ALLOC_N来分配内存吗?

有没有合法的情况下,我应该自己释放内存,或者最好总是使用ALLOC_N而不关心它?

回答

1

您可能应该使用ALLOC_N来动态管理内存分配,其中C代码需要独立于对象数据存储事物,并且存储的数据需要坚持多于一个方法调用(因此,您不能确定是否释放在特定的C函数中将被调用)。

如果您只是创建一些东西然后抛弃它,所有在一个复杂的方法调用的上下文中,那么您可以使用普通的C方法进行内存管理。 C堆栈适用于真正的基础E.g.只需声明int foo[1000];,你可以在内部使用这个数组,C将使用堆栈并像平常那样清理--Ruby当然不能访问这些数据,除非你在最后复制它。不要过度使用这个,int foo[1000000];有风险吹动堆栈并导致段错误。

该文档意味着使用ALLOC_N的另一个原因 - 您将避免某些由于调用垃圾回收而导致的内存不足情况。而且,如果你真的内存不足(而不管你的C例程会怎么做),你会得到一个稍微友好的Ruby管理的进程失败。

3

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

你应该仍然释放由ALLOC_N分配的内存。但是使用xfree而不是free - 在诸如http://www.ruby-doc.org/docs/ProgrammingRuby/html/ext_ruby.html之类的指南中不幸很好地描述了这一点,但您会发现它在Ruby源代码和其他Ruby C扩展的源代码中使用。

+1

好的博客,解释C扩展:http://blog.aeolusproject.org/category/ruby/page/2/ – thomthom 2013-05-09 09:56:25

+0

较新的功能可能是使用'ruby_xfree'。 – thomthom 2014-02-06 17:35:03

相关问题