前言:
在c++
中,在堆上分配動態記憶體和釋放動態記憶體的方法是
new
和delete
,在申請記憶體之後,如果不使用了就需要
delete
掉,不然就會造成記憶體的溢位。附錄:
new的動態記憶體,只要在程式結束之前
delete
就行,這樣在程式結束之前就可以把申請到的堆記憶體返還給系統,但是在實際的程式設計過程中,一般為了及時釋放不用的空間提高記憶體的使用率而在不需要的位置呼叫
delete
來釋放,以免造成記憶體占用過高和程式結束之前忘掉,從而造成的記憶體溢位。 在
cosos2d-x
中,對於引擎本身而言,自帶了
autorelease
方法,可以將物件的指標加入
push
到自動釋放池中。在每一幀結束的時候呼叫
pop對池中的物件指標執行
退出自動釋放池,並且根據引用計數來實現自動釋放。這一連串的動作,在看了幾天的部落格文章,「消化理解」後,發現把自己弄懵了。
還是從頭再來吧,接著從原始碼本身出發去理解,由於是在除錯魔塔demo的時候出現了很多記憶體洩露提示(vs2010+ cocos2d-x 2.1.3 + vld),本著堅決消化吸收cocos2d-x中的記憶體管理方法,重複除錯了好多遍,現在來做個總結。
首先,cocos2d-x官方推薦的生成物件方式 是使用create_func巨集,巨集中已經有乙個autorelease()呼叫,所以只需要直接 classname *pobject = classname::create(),呼叫就行,小補充下:如果需要使用記憶體自動管理的功能,需要直接或間接繼承ccobject類就行。當你加入以後,基本不需要對該物件的指標進行釋放之類的操作,當然是沒進行pobject->retain()(需要再執行pobject->release())操作。很方便的管理了需要在堆上分配的記憶體。推薦使用autorelease()來管理對記憶體的釋放。
其次,對於分配的記憶體有當前類資料成員和區域性作用域中的區域性物件的指標,類資料成員直接autorelease(),在類的生命週期結束時,類的析構函式中不需要再次釋放了,因為引擎自動幫你釋放了,對於區域性的物件的指標,呼叫autorelease()後也不需要再次去釋放了,都交給引擎去釋放吧。
最後,對於手動操作而言 new操作和delete操作成對出現就行,類資料成員則在析構函式中delete,以免提前釋放了,造成記憶體操作錯誤。再者如果執行classname *pobject = new classname(); pobject->autorelease()亦可使用引擎的記憶體管理功能,前提是classname 直接或間接繼承自ccobject類。
第一次寫cocos2d-x記憶體管理的心得,請大家看著玩,參考了很多大神的記憶體管理博文,其中由於自己水平有限,沒能好好理解,反而把自己弄暈了,著實對不起各位大神們的辛苦分享,再次感謝大神們分享的博文。。
再次補充下,對於類成員使用create靜態方法之後,建議retain下,因為在類物件的生命週期內不能釋放掉,所以留到析構函式再release!
cocos2dx 記憶體管理
記憶體管理中經常遇到的問題 記憶體洩露,記憶體溢位。在cocos2dx中用的是引用計數和自動釋放池的技術,由於熟悉objective c語言,所以對這兩個概念不會很陌生。一 引用計數 引用計數是自動記憶體管理的基礎 在物件裡增加乙個引用計數,當外部引用增加時,計數器加1,當外部引用消失時,計數器減1...
cocos2d x 記憶體管理
呼叫了autorelease的物件,將會在自動 池釋放的時候被釋放一次。因為這個操作發生在 mainloop drawscene 後,這時候遊戲中所有的邏輯已經執行完畢,正是釋放無效資源的最佳時機。所以乙個物件被create後,將被放進pool中,其ref 數為1,當遊戲整個邏輯跑完,如果沒有增加r...
cocos2dx 記憶體管理
我們知道,cocos2dx中使用了引用計數的方式去管理記憶體,不需要我們手動delete的去釋放記憶體。那麼cocos2dx中是怎麼實現引用計數的記憶體管理方式的呢?cocos2dx中的記憶體管理用到了兩個工具 引用計數器 ref 自動 池 autoreleasepool 引用計數器 ref ref...