2013-05-06 47 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

相關問題