前言:c++記憶體機制,採用new關鍵字例項化的物件,必須在不使用的時候手動delete掉,否則new的時候開闢的記憶體就不能被**,造成記憶體洩露。
我們來舉個例子說明一下:
執行 結果,vld工具提示了存在記憶體洩露:
當加上delete操作後:
下面步入正題:
1、cocos2d-x 記憶體管理的方式,cocos2d-x採用引用計數的方式進行記憶體管理,當乙個物件的引用計數為0的時候,就會被引擎自動delete掉。
所有cocos2d-x裡面的類都繼承ccobject類(應該是吧、),下面看ccobject類原始碼:
這裡 m_ureference 就是引用計數,在物件構造的時候,m_ureference置為1
然後每次對物件進行retain操作,reference+1
每次對物件進行release操作,reference-1,如果reference在這次release之後變為0,那麼delete掉它
2、以上是記憶體管理的基本原則,下面來講引擎中是怎麼對物件進行自動管理(autorelease)的。
我們以乙個ccnode的生命歷程為例,來講一下自動管理的整個過程:
首先建立乙個ccnode:
ccnode物件被new出來之後,立刻執行autorelease操作,我們來進行跟蹤:
可以看到,首先將m_bmanaged置為true,表示處於自動管理狀態,然後加入自動管理池,繼續跟蹤:
getcurreleasepool() 返回乙個 ccautoreleasepool 物件指標,也就是乙個自動釋放池,那麼我們先去看看這個自動釋放池裡面有什麼:
首先就是乙個ccobject陣列,m_pmanagedobjectarray , 這個陣列放的就是接受自動釋放的物件,也就是說,進行autorelease的物件,最終被放到它裡面去了
那我們注意一下這裡,m_pmanagedobjectarray 是乙個 ccmutablearray 物件,它的addobject()方法除了把乙個物件放到這個array裡面去,還做了什麼呢,我們來看看原始碼:
大家應該看到了,進行了一次retain()操作,使得物件的引用+1,那麼物件在被add到這個array裡之後,引用應該為2(不考慮其他地方進行的retain),所以在此之後立刻進行了一次release(),使得這次add造成的引用取消,這樣一來,物件從建立開始引用為1,到現在被放進自動釋放池中後,引用依然為1,同時,被管理狀態為true。
那麼我再進行深入的分析一下
getcurreleasepool()->addobject(pobject);
裡面的getcurreleasepool()方法,注意這個方法是 ccpoolmanager 的方法:
那麼我看到 ccpoolmanager 類,顧名思義,我們也想得到它是對自動釋放池進行管理的類,這是個全域性變數,在main()函式執行之前由系統自動呼叫其預設構造方法進行例項化。下面進入這個類去看看裡面有些什麼:
我們發現了,裡面有乙個 ccautoreleasepool 物件 m_pcurreleasepool, 看它名字, 可以理解為 當前自動釋放池 ,然後有乙個記憶體池的陣列 m_preleasepoolstack ,裡面放的就是多個記憶體釋放池了(我好像就看到乙個進去了)。那麼我們連上剛才的思路,進去看看push()函式,做了什麼事情:
如**所示,push()操作new了乙個自動釋放池物件,並且將它賦值給 當前自動釋放池(m_pcurreleasepool),然後將這個new的自動釋放池物件放到ccpoolmanager 裡面的 釋放池陣列中。注意過程中對其引用計數的控制,自動釋放池本身也是繼承ccobject的,也有自己的引用計數,受相同的記憶體管理方式。
那麼到這裡,乙個物件的autorelease()過程就完成了。
那麼我來做乙個簡單的總結:
首先 new 乙個物件, 然後執行其autorelease()方法,接下來是得到ccpoolmanager 物件(這是乙個全域性的物件),用它的getcurreleasepool獲取 當前自動釋放池物件,並將這個new的物件放入 當前自動釋放池物件 裡面的m_pmanagedobjectarray陣列中,修改其被管理狀態 m_bmanaged 為 true。執行完這個完整的操作之後,這個新new出來的物件的引用次數為1,被管理狀態為true,並且被放在乙個管理物件的陣列中。
cocos2d x記憶體管理機制
c 記憶體機制,採用new關鍵字例項化的物件,必須在不使用的時候手動delete掉,否則new的時候開闢的記憶體就不能被 造成記憶體洩露 npc n1 new npc if exit 0 cocos2d x 記憶體管理的方式,cocos2d x採用引用計數的方式進行記憶體管理,當乙個物件的引用計數為...
cocos2dx 記憶體管理機制(2)
首先我們要知道,cocos2d x的引擎執行緒是單執行緒的,它不停的呼叫乙個主迴圈來繪製當前的scene 同時對一些自動釋放的物件進行管理。一 現在開始定位,我們知道win32 下cocos2dx程式入口 run方法裡面有這麼一句 ccdirector shareddirector mainloop...
Cocos2dx 記憶體管理機制(1)
1.引用計數機制 要了解cocos2dx引用計數的機制,首先我們來看看ccobject這個類 class cc dll ccobject public cccopying friend class ccautoreleasepool 說明 當m ureference 0時會自動釋放該物件,每引用一次...