由于开始并没有介绍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.
本书交流讨论网站:http://www.cocoagame.net
《Cocos2d-x实战 C++卷》现已上线,各大商店均已开售:
京东:http://item.jd.com/11584534.html
当当: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
Cocos2d-x开发中C++内存管理的更多相关文章
-
Unity游戏开发中的内存管理_资料
内存是手游的硬伤——Unity游戏Mono内存管理及泄漏http://wetest.qq.com/lab/view/135.html 深入浅出再谈Unity内存泄漏http://wetest.qq.c ...
-
iOS开发中的内存管理
一.为什么要进行内存管理 系统资源有限,iOS会为每一个执行的程序分配30M的内存,超过20M会收到内存警告,超过30M将会终止应用程序.因此,要及时回收一些不须要再继续使用的内存空间,比方回收一些不 ...
-
Cocos2d-x开发中Ref内存管理
Ref类是Cocos2d-x根类,Cocos2d-x中的很多类都派生自它,例如,我们熟悉的节点类Node也派生自Ref.我们介绍Ref内存管理.内存引用计数Ref类设计来源于Cocos2d-iphon ...
-
JNI中的内存管理(转)
源:JNI中的内存管理 JNI 编程简介 JNI,Java Native Interface,是 native code 的编程接口.JNI 使 Java 代码程序可以与 native code 交互 ...
-
Android中的内存管理机制以及正确的使用方式
概述 从操作系统的角度来说,内存就是一块数据存储区域,属于可被操作系统调度的资源.现代多任务(进程)的操作系统中,内存管理尤为重要,操作系统需要为每一个进程合理的分配内存资源,所以可以从两方面来理解操 ...
-
C++中的内存管理
在C++中也是少不了对内存的管理,在C++中只要有new的地方,在写代码的时候都要想着delete. new分配的时堆内存,在函数结束的时候不会自动释放,如果不delete我分配的堆内存,则会造成内存 ...
-
cocos2dx中的内存管理机制及引用计数
1.内存管理的两大策略: 谁申请,谁释放原则(类似于,谁污染了内存,最后由谁来清理内存)--------->适用于过程性函数 引用计数原则(创建时,引用数为1,每引用一次,计数加1,调用结束时, ...
-
6.关于QT中的内存管理,动态的制作,动态库的调用,静态库的制作
一 QT的内存管理 1 QT中的内存管理是QObject来管理的 2 QT中的内存管理没有cocos2dx中的引用计数 3 组件能够指定父对象 QTimer *timer = QTime ...
-
C语言中的内存管理
开始陆续的发一下唐老师视频的笔记吧,顺便带一些正冲哥书的的内容.不能一下都发出来,因为内容发多了自己也受不了,而且发的都是学习视频时候的一些笔记,可能会有一些问题不是很清晰. 先说一下C语言中的内存管 ...
随机推荐
-
hdu3530 单调队列
Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
-
Swift3.0P1 语法指南——枚举
原档: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programm ...
-
特征检测之Haar
Harr特征, 主要用于人脸检测,可以参考我的博文 基于MATLAB的adaboost级联形式的人脸检测实现 1 harr特征的原理 2 haar特征的计算 3 haar特征的应用
-
IOS中Json解析的四种方法
作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此“http://www.bejson.com/”网站来进行JSON格式化校验 ...
-
js-自制轮播插件!
刚接触轮播的时候,感觉这种东西好高端,后来学习了jquery后,发现原来挺简单的,而且实现轮播也有很多形式,我用jquery自制了一个轮播插件,其实我这个说是插件,好像其实就是一个高度抽象的函数而已. ...
-
Openwrt LuCI模块练习详细步骤
前言 又到了成胖子^_^每周一博的时间了.最近在学习openwrt luci方面的知识,为了贯穿整个知识体系,练习题目为: 通过页面配置周期性地往/tmp/addtest文件写入内容和时间戳 1.在w ...
-
jsp 微信公众平台 token验证(php、jsp)(转载)
微信公众平台现在推出自动回复消息接口,但是由于是接口内容用的是PHP语言写的,很多地方操作起来让本人这个对java比较熟悉的小伙很别扭,所以仿照PHP的接口代码做了一套jsp语言编写的接口. 首先先把 ...
-
查看ORACLE执行计划的几种常用方法
SQL的执行计划实际代表了目标SQL在Oracle数据库内部的具体执行步骤,作为调优,只有知道了优化器选择的执行计划是否为当前情形下最优的执行计划,才能够知道下一步往什么方向. 执行计划的定义:执行目 ...
-
P2178 [NOI2015]品酒大会
思路 在后缀树上进行一些操作就好了 后缀树上LCA的maxlen就是两个后缀的LCP的长度了 然后统计每个点作为LCA的次数和最大值.次大值.最小值.次小值 然后就做完了 代码 #include &l ...
-
Ionic-轮播图ion-slide-box
官方用法介绍:http://www.ionic.wang/js_doc-index-id-44.html 用法 <ion-slide-box> <ion-slide> < ...