Cocos2d-x開發中C++內存管理

因爲開始並無介紹C++語言,C++的內存管理固然也沒進行任何的說明,爲了掌握Cocos2d-x中的內存管理機制,是有必要先了解一些C++內存管理的知識。
C++內存管理很是複雜,若是徹底地系統地介紹可能須要一本書的篇幅才能解釋清楚。這裏只給你們介紹C++內存管理最爲基本的用法。


內存分配區域
建立對象須要兩個步驟:第一步,爲對象分配內存,第二步,調用構造函數初始化內存。在第一步中對象分配內存時候,咱們能夠選擇幾個不一樣的分配區域,這幾個區域以下:
棧區域分配。棧內存分配運算內置於處理器的指令集中,效率很高,可是分配的內存容量有限。由處理器自動分配和釋放,用來存放函數的參數值和局部變量的值等。在執行函數時,函數內局部變量的存儲單元均可以在棧上建立,函數執行結束時這些存儲單元自動被釋放。
堆區域分配。從堆上分配,亦稱動態內存分配。由開發人員分配釋放,若是不釋放,程序結束時由操做系統回收。 程序在運行的時候用malloc或new申請任意多少的內存,開發人員本身負責在什麼時候用free或delete釋放內存。動態內存的生存期由開發人員決定,使用很是靈活,但問題也最多。
在靜態存儲區域分配。這個內存空間在程序的整個運行期間都存在,內存在程序編譯的時候就已經分配好。它能夠分配全局變量和靜態變量。


動態內存分配
動態內存分配最爲靈活可是問題也不少,咱們重點介紹動態內存分配。動態內存使用malloc或new分配內存,使用free或delete釋放內存。其中malloc和free是成對的,new和delete是成對的。
一、malloc和free使用
malloc和free是C/C++語言的標準庫函數,主要是在C中使用。使用malloc建立對象,不會自動調用構造函數初始化內存。使用free釋放對象,不會自動調用析構函數清除內存。
使用malloc和free分配和釋放內存的實例代碼以下:
html

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片ios

  1. #include <iostream>  編程

  2.   

  3.   

  4. using namespace std;  微信

  5.   

  6.   

  7. class MyObject    函數

  8. {    測試

  9. public :   網站

  10.     MyObject(){                                                             ①  spa

  11.         cout << "call constructor." << endl;   操作系統

  12.     }    .net

  13.       

  14.     ~MyObject(){                                                            ②  

  15.         cout << "call destructor." << endl;   

  16.     }    

  17.   

  18.   

  19.     void initialize(){                                                      ③  

  20.         cout << "call initialization." << endl;   

  21.     }    

  22.       

  23.     void destroy(){                                                         ④  

  24.         cout << "call destroy." << endl;   

  25.     }    

  26. };    

  27.   

  28.   

  29. int main(){  

  30.   

  31.   

  32.     MyObject *obj = (MyObject *)malloc(sizeof(MyObject)); // 申請動態內存                 ⑤  

  33.     obj->initialize();                                                       ⑥  

  34.       

  35.     //TODO  

  36.       

  37.     obj->destroy();                                                          ⑦  

  38.     free(obj);                                                              ⑧  

  39.     obj = NULL;  

  40.   

  41.   

  42.     return 0;  

  43. }  



上述代碼建立了聲明瞭MyObject類,其中第①行代碼是聲明構造函數,第②行代碼是聲明析構函數。第③行代碼是聲明初始化函數void initialize()在使用malloc分配內存時候不能調用構造函數,經過調用該函數初始化該對象。第④行代碼是聲明清除函數void destroy()在使用free釋放對象內存時候,經過調用該函數清除該對象的一些資源。
第⑤~⑧行是調用MyObject類進行測試,其中第⑤行代碼MyObject *obj = (MyObject *)malloc(sizeof(MyObject))是使用malloc函數分配內存,使用該函數須要指定對象的長度,還有malloc函數返回值是void*,因爲C++不容許void*賦值給其它指針,因此須要強制類型轉換。因爲構造函數不能顯式調用,因此須要第⑥行代碼是初始化對象。
第⑧行代碼free(obj)是釋放obj對象內存。在釋放對象內存以前,咱們在第⑦行代碼obj->destroy()是在釋放對象內存以前調用,清除該對象的一些資源,它的做用至關於析構函數。可是真正的析構函數~MyObject()並無調用。
運行結果以下:
call initialization.
call destroy.


二、new和delete使用
與malloc和free不一樣,new和delete不是函數庫,而是C++的運算符。new運算符可以完成建立對象全部步驟(即:第一步,爲對象分配內存,第二步,調用構造函數初始化內存),它也會調用構造函數。實例代碼:
MyObject *obj = new MyObject();
構造函數能夠重載,根據用戶傳遞的參數列表,決定調用哪一個構造函數進行初始化對象。
new運算符反操做運算符是delete,delete先調用析構函數,再釋放內存。實例代碼:
delete obj;
obj是對象指針,obj只能釋放new建立的對象,不能釋放有malloc建立的。並且採用delete釋放後的對象指針,須要obj=NULL以防止「野指針」。
提示  一種狀況是,指針變量沒有被初始化,它的指向是隨機的,它會亂指一氣,並非爲NULL。若是使用if語句判斷,則認爲是有效指針。另外狀況是,指針變量被free或者delete以後,它們只是把指針所指的內存給釋放掉,但並無把指針自己清除,此時指針指向的就是「垃圾」內存。若是使用if語句判斷,也會認爲是有效指針。「野指針」是很危險的,良好的編程習慣是,這兩種狀況下都須要將指針設置爲NULL,這是避免「野指針」的惟一方法。
使用new和delete分配和釋放內存的實例代碼以下:

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. #include <iostream>  

  2.   

  3.   

  4. using namespace std;  

  5.   

  6.   

  7. class MyObject    

  8. {    

  9. public :   

  10.     MyObject(){  

  11.         cout << "call constructor." << endl;   

  12.     }    

  13.       

  14.     ~MyObject(){   

  15.         cout << "call destructor." << endl;   

  16.     }    

  17.   

  18.   

  19.     void initialize(){   

  20.         cout << "call initialization." << endl;   

  21.     }    

  22.       

  23.     void destroy(){   

  24.         cout << "call destroy." << endl;   

  25.     }    

  26. };    

  27.   

  28.   

  29. int main(){  

  30.   

  31.   

  32.     MyObject *obj = new MyObject(); // 申請動態內存    

  33.   

  34.   

  35.     //TODO  

  36.   

  37.   

  38.     delete obj;  

  39.     obj = NULL;  

  40.   

  41.   

  42.     return 0;  

  43. }   



一樣是MyObject類,採用是new分配內存,delete釋放內存。程序運行會調用構造函數和析構函數。運行結果以下:
call constructor.

call destructor.


更多內容請關注國內第一本Cocos2d-x 3.2版本圖書《Cocos2d-x實戰:C++卷》

本書交流討論網站:http://www.cocoagame.net
更多精彩視頻課程請關注智捷課堂Cocos課程:http://v.51work6.com

歡迎加入Cocos2d-x技術討論羣:257760386

歡迎關注智捷iOS課堂微信公共平臺

相關文章
相關標籤/搜索