`

Cocos2d-x开发中C++内存管理

 
阅读更多

由于开始并没有介绍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分配和释放内存的实例代码如下:

[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 = (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.


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分配和释放内存的实例代码如下:

[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.

 

 

更多内容请关注最新Cocos图书《Cocos2d-x实战 C++卷》
本书交流讨论网站:http://www.cocoagame.net
更多精彩视频课程请关注智捷课堂Cocos课程:http://v.51work6.com
欢迎加入Cocos2d-x技术讨论群:257760386


《Cocos2d-x实战 C++卷》现已上线,各大商店均已开售:

京东:http://item.jd.com/11584534.html

亚马逊:http://www.amazon.cn/Cocos2d-x%E5%AE%9E%E6%88%98-C-%E5%8D%B7-%E5%85%B3%E4%B8%9C%E5%8D%87/dp/B00PTYWTLU

当当:http://product.dangdang.com/23606265.html

互动出版网:http://product.china-pub.com/3770734

 

《Cocos2d-x实战 C++卷》源码及样章下载地址:

源码下载地址:http://51work6.com/forum.php?mod=viewthread&tid=1155&extra=page%3D1 

样章下载地址:http://51work6.com/forum.php?mod=viewthread&tid=1157&extra=page%3D1

欢迎关注智捷iOS课堂微信公共平台
分享到:
评论

相关推荐

    Cocos2d-x实战:C++卷(2版)源代码

    在Cocos2d-x中,C++作为主要的编程语言,相比初版,第二版可能涵盖了更多Cocos2d-x的新特性和优化。C++的使用可以提供更好的性能和更直接的内存管理,同时也能充分利用面向对象编程的特性来构建复杂的游戏逻辑。 源...

    Cocos2d-x实战C++卷关东升著完整版pdf

    本书可能会详细讲解Cocos2d-x中的内存管理机制,如自动引用计数(ARC)和弱引用,以及如何通过优化代码和数据结构来提高游戏运行效率。 最后,还会涉及到Cocos2d-x的构建系统和发布流程,包括多平台支持、资源打包...

    cocos2d-x实战 c++卷教程及完整源码

    cocos2d-x实战 c++卷教程及完整源码下载,使用最新cocos2d-x-3.14版本,在xcode7.3上已编译通过。 解决相关问题 1、解决源程序在高版本上无法编译问题 2、解决源程序中文注释部分,xcode上显示乱码问题 3、根据书籍...

    Cocos2d-x实战++JS卷++Cocos2d-JS开发+PDF电子书下载+带书签目录+完整

    标题中提到了"Cocos2d-x实战++JS卷++Cocos2d-JS开发+PDF电子书下载+带书签目录+完整",这里面包含了几个关键知识点: 1. Cocos2d-x:是一个开源的游戏开发框架,它主要用于开发跨平台的游戏和应用程序,支持iOS、...

    Cocos2d-x实战 JS卷 Cocos2d-JS开发

    6. **音频和音乐**:介绍如何在Cocos2d-x中播放背景音乐和音效,以及音乐的控制和管理。 7. **网络与存储**:讨论如何进行网络通信,如下载更新、保存和读取游戏数据。 8. **性能优化**:提供关于代码优化、内存...

    Cocos2d-x实战C++卷 关东升著 完整版含目录

    虽然上述内容没有具体提及,但任何一本关于Cocos2d-x的实战书籍都可能会涉及到一些重要的开发工具和环境设置,例如IDE(集成开发环境)、编译器配置、依赖库管理、项目结构搭建等。 再次强调,以上内容是根据书籍...

    cocos2d-x-cocos2d-x-2.2.2.zip

    在cocos2d-x 2.2.2中,开发者可以利用C++语言进行编程,同时也支持Lua和JavaScript作为脚本语言,这大大增加了开发的灵活性。C++的性能优势结合脚本语言的易用性,使得游戏的开发过程既高效又便捷。同时,cocos2d-x...

    cocos2d-x-3.1.zip

    10. **性能优化**:Cocos2d-x 3.1对内存管理和渲染效率进行了优化,以确保在不同设备上的流畅运行。 11. **脚本支持**:虽然3.1版本主要以C++为主,但Cocos2d-x也支持Lua和JavaScript,允许开发者选择更适合自己的...

    cocos2d-x-3.13.1 spine3.6.zip

    Cocos2d-x是一个广泛使用的开源游戏开发框架,它基于C++,同时支持Lua和JavaScript等多种脚本语言,为开发者提供了高效、跨平台的游戏开发解决方案。在3.13.1版本中,Cocos2d-x对Spine动画引擎的集成进行了更新,这...

    经典版本 方便下载 源码 旧版本 3.8 官网找不到了 cocos2d-x-3.8.zip

    cocos2d-x 是一个跨平台的游戏开发框架,它基于C++,同时提供了Lua和JavaScript的绑定,让开发者可以方便地在多种操作系统上创建2D游戏、演示程序和其他图形交互应用。这个“cocos2d-x-3.8.zip”压缩包包含的是cocos...

    cocos2d-x_v3.16安装及环境变量配置文档

    cocos2d-x 是一个开源的游戏开发框架,使用 C++ 语言编写,支持多平台发布,包括 iOS、Android、Windows、macOS、Linux 和 Web。cocos2d-x v3.16 是该框架的一个版本号,本文档主要介绍了该版本的安装流程以及环境...

    Cocos2d-x实战 JS卷

    8. **网络编程**:学习如何在Cocos2d-x中实现网络通信,包括HTTP请求、WebSocket连接,以及游戏中的数据同步。 9. **音频播放**:掌握音频管理,包括背景音乐、音效的播放与控制,提升游戏体验。 10. **性能优化**...

    cocos2d-x API中文文档

    cocos2d-x是一个基于MIT许可证的开源游戏引擎,它以快速、简单且功能强大的特性闻名,允许开发者使用C++、Lua和JavaScript进行跨平台开发,支持包括iOS、Android、Windows Phone、Blackberry以及Tizen在内的多个平台...

    cocos2d-x 案例开发大全 第二章(源码)

    3. **场景和层管理**:在cocos2d-x中,游戏逻辑通常组织在不同的场景(Scene)和层(Layer)中。场景是游戏的主要容器,而层则是场景中的子容器,用于承载具体的游戏元素和逻辑。 4. **精灵(Sprite)和动画(Animation)**...

    cocos2d-x 3.0

    《cocos2d-x 3.0:游戏开发中的角色移动技术详解》 在游戏开发领域,cocos2d-x是一款广泛使用的开源2D游戏引擎,尤其在移动平台上的应用非常广泛。cocos2d-x 3.0版本带来了许多性能优化和新特性,使得开发者能够更...

    cocos2d-x源码素材

    在cocos2d-x中,我们可以利用物理引擎如Box2D或 Chipmunk进行复杂的碰撞检测,也可以使用简单的矩形碰撞检测函数如`cc.rectIntersectsRect()`来检查两个矩形是否相交。此外,cocos2d-x还支持自定义的碰撞检测算法,...

    cocos2d-x-2.1.4.rar

    《cocos2d-x 2.1.4:探索移动游戏开发的新篇章》 cocos2d-x 是一个跨平台的2D游戏开发框架,它为开发者提供了强大的工具和技术支持,使得游戏开发变得更为便捷。2.1.4 版本是这个框架的一个重要里程碑,它在前一...

    cocos2d-x 3.15 C++ 俄罗斯方块源码

    在cocos2d-x中实现俄罗斯方块,我们需要关注以下几个核心模块: 1. **游戏逻辑**:这是游戏的核心部分,包括方块的生成、旋转、移动、消除行等操作。开发者需要理解并实现这些算法,确保游戏规则的正确执行。 2. *...

    迷失航线-Cocos2d-x项目实战-射击类游戏-关东升

    Cocos2d-x是一个开源的游戏开发框架,它使用C++作为主要编程语言,同时支持Lua和JavaScript,广泛应用于2D游戏开发。在这个项目实战中,我们将深入探讨如何利用Cocos2d-x 3.2版本构建一款完整的射击游戏。 首先,...

Global site tag (gtag.js) - Google Analytics