因为?始并没有介绍C++语言,C++的内存管理当然也没进行不论什么的说明,为了掌握Cocos2d-x中的内存管理机制,是有必要先了解一些C++内存管理的知识。 C++内存管理非常复杂,假设全然地系统地介绍可能须要一本书的篇幅才干解释清楚。这里仅仅给大家介绍C++内存管理为主要的使用方法。 内存分配区域 创建对象须要两个步骤:第一步,为对象分配内存,第二步,调用构造函数初始化内存。在第一步中对象分配内存时候,我们能够选择几个不同的分配区域,这几个区域例如以下: 栈区域分配。栈内存分配运算内置于处理器的指令集中,效率非常高,可是分配的内存容量有限。由处理器自己主动分配和释放,用来存放函数的?数值和局部变量的值等。在执行函数时,函数内局部变量的存储单元都能够在栈上创建,函数执行结束时这些存储单元自己主动被释放。 堆区域分配。从堆上分配,亦称动态内存分配。由开发者分配释放,假设不释放,程序结束时由操作系统回收。 程序在执行的时候用malloc或new申请随意多少的内存,开发者自己负责在何时用free或delete释放内存。动态内存的生存期由开发者决定,使用非常灵活,但问题也多。 在静态存储区域分配。这个内存空间在程序的整个执行期间都存在,内存在程序编译的时候已经分配好。它能够分配全局变量和静态变量。 动态内存分配 动态内存分配为灵活可是问题也非常多,我们重点介绍动态内存分配。动态内存使用malloc或new分配内存,使用free或delete释放内存。当中malloc和free是成对的,new和delete是成对的。 1、malloc和free使用 malloc和free是C/C++语言的标准库函数,主要是在C中使用。使用malloc创建对象,不会自己主动调用构造函数初始化内存。使用free释放对象,不会自己主动调用析构函数清除内存。 使用malloc和free分配和释放内存的实例代码例如以下: #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 = (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.
2、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分配和释放内存的实例代码例如以下: #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.