记录关于cocos2dx内存管理机制可能崩溃的一个坑

大年初一写代码,纪念一下:)

cocos2dx,内存管理方式如下:

所有Ref继承而来的类,皆放入AutoreleasePool,每一帧释放一次,如果引用计数为0,则delete。

因此,Ref在每帧的工作,就是先ref+1,后ref-1,让它ref-1的是AutoreleasePool,而让它ref+1的就各有方式了。最常见的就是CCNode,每帧为子节点retain的方式。

一般这是不会有问题的。如果你有需求在类中保存一个Ref对象,而它并非一个子节点,如RenderTexture,则必须记住自己写代码retain。

此处有一个容易出错的地方:如果你对这个Ref的create本身是在某个Update中做的,那应该当场retain一次。因为Update调用完AutoreleasePool紧接着就会release,直接导致Ref被删除,没机会坚持到下次update。

如果代码中使用了自己维护的Ref对象,而发生了莫名其妙的崩溃,不妨看看是不是这个问题。

时间: 2024-12-25 05:24:56

记录关于cocos2dx内存管理机制可能崩溃的一个坑的相关文章

2、COCOS2D-X内存管理机制

在C++中,动态内存分配是一把双刃剑,一方面,直接访问内存地址提高了应用程序的性能,与使用内存的灵活性:另一方面,由于程序没有正确地分配与释放造成的例如野指针,重复释放,内存泄漏等问题又严重影响着应用程序的稳定性. 人们尝试着不同的方案去避免这个问题,比较常用的如智能指针,自动垃圾回收等,这些要么影响了应用程序的性能,要么仍然需要依赖于开发者注意一些规则,要么给开发者带来了另外一些很丑陋的用法(实际上笔者很不喜欢智能指针).因此,优秀的C++内存管理方案需要兼顾性能,易用性,所以到目前为止C++

帝国塔防2充值界面闪退BUG修复总结(cocos2dx内存管理机制)

游戏充值界面老是闪断,debug调试断点总是断在比较深的位置,也看不出哪里出错. 后来有一次断点断在了程序创建一个提示图片的地方,于是检查代码发现了问题. 修改之前的错误代码: 1.创建提示的代码: m_loading = new NetLoading(this, callfunc_selector(IapShopLayer::downingUpdate)); // m_loading 引用计数为1 m_loading->setPosition(ccp(1139/2.0f, 640.0f/2.0

cocos2d-x内存管理机制解析(转载)

最近在看内存管理的源码,发现这篇文章讲的不错,思路很清晰,故转载收藏. 原地址:http://blog.csdn.net/a7833756/article/details/7628328 1.cocos2d-x 内存管理的方式,cocos2d-x采用引用计数的方式进行内存管理,当一个对象的引用计数为0的时候,就会被引擎自动delete掉. 所有cocos2d-x里面的类都继承ccobject类(应该是吧.),下面看ccobject类源码: 这里 m_uReference 就是引用计数,在对象构造

cocos2dx内存管理机制

http://blog.csdn.net/ring0hx/article/details/7946397 http://blog.csdn.net/whuancai/article/details/23347143 1,当使用create方法创建对象的时候 会调用autoRealse(),new 操作符 会调用构造函数,ReferenceCount = 1,然后放到内存回收池的. 2,addChild的时候,ReferenceCount = 2, 3,此帧结束的时候它的引用计数减1, 比如下面代

Cocos2d-x内存管理

Cocos2d-x内存管理浅解 1.首先我们知道内存管理分为c++自身管理机制以及Cocos2d-x内存管理机制.在c++中,内存分为堆区.栈区.静态存储区(全局存储区).常量存储区.自由存储区. 主要先说一下堆区和栈区.堆区主要由new和malloc分配,new与delete,malloc与free成对出现,保证内存的分配与回收.堆内存分配地址是逐渐增大的,这一点与栈区相反,我们都知道栈是先进后出,所以栈的存储方向是内存地址逐渐减小的.栈中的内存也是系统自动回收的,这个我们不需要考虑自己管理内

cocos2dx[3.2](24)——内存管理机制

[参考] http://zh.wikipedia.org/wiki/引用计数 (引用计数--维基百科) http://cn.cocos2d-x.org/tutorial/show?id=2300 (引用计数和自动释放池) http://cn.cocos2d-x.org/tutorial/show?id=1331 (内存管理--绕不过去的坎) http://blog.csdn.net/legendof1991/article/details/23360131 (内存优化) https://gith

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

Cocos2d-x 3.x内存管理机制 1:C++内存管理 1-1:内存分配区域 创建对象需要两个步骤:第一步,为对象分配内存:第二步,调用构造函数初始化内存.在第一步中,可以选择几个不同的分配区域.这几个区域如下: (1) 栈区域分配.栈内存分配运算内置于处理器的指令集中,效率很髙,但是分配的内 存容量有限.由处理器自动分配和释放,用来存放函数的参数值和局部变量的值等.在执 行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放. (2) 堆区域分配.从堆上分

cocos2dx的内存管理机制

首先我们必须说一下c++中变量的内存空间的分配问题,我们在c++中写一个类,可以在栈上分配内存空间也可以使用new在堆上分配内存空间,如果类对象是在栈上分配的内存空间,这个内存空间的管理就不是我们的事了,但如果是在堆上分配的内存空间,当然需要我们来手动的delete了!cocos2dx采用的是在堆上分配内存空间,想想看你在写程序的时候对于cocos2dx中的类是不是大多数都是通过工厂方法获得的一个指针,你见过在栈上分配内存空间的情况吗?所以问题来了,既然在堆上分配内存空间,那么如何管理这个内存空

Cocos2d-x 3.1 内存管理机制

Cocos2d-x使用的内存管理方式是引用计数,引用计数是一种很有效的机制,通过给每个对象维护一个引用计数器,记录该对象当前被引用的次数.当对象增加一次引用时,计数器加1:而对象失去一次引用时,计数器减1:当引用计数为0时,标志着该对象的生命周期结束,自动触发对象的回收释放.引用计数的重要规则是每一个程序片段必须负责任地维护引用计数,在需要维持对象生存的程序段的开始和结束分别增加和减少一次引用计数,这样就可以实现十分灵活的内存管理. 接下来看一下Cocos2d-x 3.1 版本的源码是怎么实现引