内存管理机制
1 c++内存管理机制
(1)new /delete C++中新增 (注意:释放数组用 delete[])
char* p = new char;
delete p;
char* pArr = new char[5];
delete[] pArr;
(2)malloc / free c语言原有的
char* p = (char*) malloc(sizeof(char));
free(p);
2 引用计数管理机制(实现简单,缺点是循环引用)
(1) 接口
sprite->retain(); //计数加1 如果对一个对象赋值,需要手动加一
sprite->release();//计数减一
sprite->retainCount();//返回计数
(
其他机制还有
《2. 标记-清扫(mark-sweep)
基本思路是先按需分配,等到没有空闲内存的时候从寄存器和程序栈上的引用出发,遍历以对象为节点、以引用为边构成的图,把所有可以访问到的对象打上标记,然后清扫一遍内存空间,把所有没标记的对象释放。
《3 节点复制(copying)
基本思路是把整个内存空间一分为二,不妨记为 A 和 B。所有对象的内存在 A 中分配,当 A 塞满的时候,同样从寄存器和程序栈上的引用出发,遍历以对象为节点、以引用为边构成的图,把所有可以访问到的对象复制到 B 去,然后对调 A 和 B 的角色。
《4 分代(generational)垃圾收集。它的基本思路是这样的:程序中存在大量的临时对象,分配出来之后很快就会被释放,而同时如果一个对象分配出来之后相当长的一段时间内都没回收,那么极有可能它的生命周期很长,尝试收集它会是无用功。所以可以把内存有意识地按“对象年龄”分成若干块,不妨记为老中青(XD),所有的分配都在青代进行,青代塞满只对青代做 GC,然后把存活下来的对象移动到中代,直到中青代都塞满,再把存活下来下来的对象移动到老代 —— 这只是个思路上的例子,实践中分代式垃圾收集算法的方案五花八门,而且常常同时使用了不止一种基本算法(比如青代用节点复制,老代用标记清扫啥的)。
)
——引申《代码的未来》,其中的 “2.4 内存管理” 对GC有较详细的论述,
并且也对几种不同编程语言的GC做了比较。
补一下2.4的章节目录:
2.4 内存管理 61
看似无限的内存 61
GC的三种基本方式 62
术语定义 62
标记清除方式 63
复制收集方式 64
引用计数方式 65
引用计数方式的缺点 65
进一步改良的应用方式 66
分代回收 66
对来自老生代的引用进行记录 67
增量回收 68
并行回收 69
GC大统一理论 69
3 自动释放机制 cocos2dx自带一个全局的内存池PoolManager,即程序内部在new之后,sprite->autorelease(); 接口中, 带init不具有自动释放机制,需new了之后再调用。 带create的具有new和自动释放机制。 4 get set的设计方法及宏,不直接访问内部变量。 (1)cocos2dx自带了属性宏 CC_SYNTHESIZE,来自动化实现get set语句声明与定义。 (2)CC_SYNTHESIZE_RETAIN 宏,只定义指针类型的get set声明。