Cocos2d-x学习笔记—内存管理机制

本文深入探讨了Cocos2d-x 3.x的内存管理机制,包括C++内存分配区域、动态内存分配,重点讲述了Cocos2d-x中的内存引用计数和autorelease的使用,以及Ref类的特殊内存管理,如Node的addChild/removeChild方法和工厂方法创建的对象自动释放。建议在使用中遵循适当原则,确保内存的有效管理。
摘要由CSDN通过智能技术生成

Cocos2d-x 3.x内存管理机制

1:C++内存管理

1-1:内存分配区域

创建对象需要两个步骤:第一步,为对象分配内存;第二步,调用构造函数初始化内存。在第一步中,可以选择几个不同的分配区域。这几个区域如下:

(1) 栈区域分配。栈内存分配运算内置于处理器的指令集中,效率很髙,但是分配的内 存容量有限。由处理器自动分配和释放,用来存放函数的参数值和局部变量的值等。在执 行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。

(2) 堆区域分配。从堆上分配,也称动态内存分配。由开发人员分配释放,如果不释 放,程序结束时由操作系统回收。程序在运行时用malloc或new申请任意多少的内存,开发人员自己负责在何时用free或delete释放内存。动态内存的生存期由开发人员决定,使用非常灵活,但问题也最多。

(3) 在静态存储区域分配。这个内存空间在程序的整个运行期间都存在,内存在程序编译的时候就已经分配好。它可以分配全局变量和静态变量。

1-2:动态内存分配

动态内存分配最为灵活但是问题也很多,这里重点介绍动态内存分配。动态内存使用 malloc或new分配内存,使用free或delete释放内存。其中,malloc和free是成对的,new 和delete是成对的。

(1)malloc和free的使用

malloc和free是C/C++语言的标准库函数,主要是在C中使用。使用malloc创建对 象,不会自动调用构造函数初始化内存。使用free释放对象,不会自动调用析构函数清除内存。

(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。这是避免“野指针”的唯一方法。

2:Cocos2d-x内存管理

在3.x版本,Cocos2d-x采用全新的根类Ref ,实现Cocos2d-x类对象的引用计数记录。引擎中的所有类都派生自Ref。Cocos2d-x内存管理是建立在C++语言new/delete之上,通过引入Object-C语言的引用计数来实现的。

2-1:内存引用计数

Ref类设计来源于Cocos2d-iphone的CCObject 类,在Cocos2d-x 2.x中也叫CCObject类。因此Ref类的内存管理是参考Objectives手动管

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值