因爲開始並無介紹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 plaincopyios
#include <iostream> 編程
using namespace std; 微信
class MyObject 函數
{ 測試
public : 網站
MyObject(){ ① spa
cout << "call constructor." << endl; 操作系統
} .net
~MyObject(){ ②
cout << "call destructor." << endl;
}
void initialize(){ ③
cout << "call initialization." << endl;
}
void destroy(){ ④
cout << "call destroy." << endl;
}
};
int main(){
MyObject *obj = (MyObject *)malloc(sizeof(MyObject)); // 申請動態內存 ⑤
obj->initialize(); ⑥
//TODO
obj->destroy(); ⑦
free(obj); ⑧
obj = NULL;
return 0;
}
上述代碼建立了聲明瞭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
#include <iostream>
using namespace std;
class MyObject
{
public :
MyObject(){
cout << "call constructor." << endl;
}
~MyObject(){
cout << "call destructor." << endl;
}
void initialize(){
cout << "call initialization." << endl;
}
void destroy(){
cout << "call destroy." << endl;
}
};
int main(){
MyObject *obj = new MyObject(); // 申請動態內存
//TODO
delete obj;
obj = NULL;
return 0;
}
一樣是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課堂微信公共平臺