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

#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运算符反操作运算符是deletedelete先调用析构函数再释放内存。实例代码
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.

更多内容请关注最新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课堂微信公共平台

时间: 2024-10-06 03:11:52

Cocos2d-x开发中C++内存管理的相关文章

Cocos2d-x开发中Ref内存管理

Ref类是Cocos2d-x根类Cocos2d-x中的很多类都派生自它例如我们熟悉的节点类Node也派生自Ref.我们介绍Ref内存管理.内存引用计数Ref类设计来源于Cocos2d-iphone的CCObject类在Cocos2d-x 2.x中也叫CCObject类.因此Ref类的内存管理是参考Objective-C手动管理引用计数Reference Count而设计的.如图所示是内存引用计数原理示意图.  每个Ref对象都有一个内部计数器这个计数器跟踪对象的引用次数被称为"引用计数"

cocos2d x-cocos2dx-cpp中的内存管理问题

问题描述 cocos2dx-cpp中的内存管理问题 请教一下:在GitHub中的cocos2dx-cpp中的cocos2d-x / tests / cpp-tests / Classes / AccelerometerTest / AccelerometerTest.cpp的代码`AccelerometerTestScene::runThisTest(){auto layer = new AccelerometerTest();addChild(layer);layer->release();/

解析PHP中的内存管理,PHP动态分配和释放内存

本篇文章是对PHP中的内存管理,PHP动态分配和释放内存进行了详细的分析介绍,需要的朋友参考下   摘要 内存管理对于长期运行的程序,例如服务器守护程序,是相当重要的影响:因此,理解PHP是如何分配与释放内存的对于创建这类程序极为重要.本文将重点探讨PHP的内存管理问题. 一. 内存在PHP中,填充一个字符串变量相当简单,这只需要一个语句"<?php $str = 'hello world '; ?>"即可,并且该字符串能够被自由地修改.拷贝和移动.而在C语言中,尽管你能够

C++中的内存管理

在C++中也是少不了对内存的管理,在C++中只要有new的地方,在写代码的时候都要想着delete. new分配的时堆内存,在函数结束的时候不会自动释放,如果不delete我分配的堆内存,则会造成内存泄露.所以我们要学会内存管理,不要内存泄露.在C++中的内存管理机制和OC中的还不太一样,在OC中的ARC机制会给程序员的内存管理省不少事,但在C++中没有ARC所以我们要自己管理好自己开辟的内存.Java中也有自己相应的内存管理机制,比如JDBC里的获取的各种资源在finally里进行close等

Open Cascade中的内存管理

Open Cascade中的内存管理 Memory Management in Open Cascade eryar@163.com 一.C++中的内存管理 Memory Management in C++ 1. 引言 为了表现出多态,在C++中就会用到大量的指针和引用.指针所指的对象是从内存空间中借来的,当然要及时归还.特别是指针在程序中随心所欲地创建,因此,一个指针究竟指向哪个对象,一个对象到底被几个指针所指向,是程序员十分关注的事情. C++中涉及到的内存管理问题可以归结为两方面:正确地掌

模拟实现C语言中的内存管理_C 语言

这里模拟了C语言中的内存管理,当我们要创建或者使用一个对象时,那么这个对象会调用retain方法,计数+1,当我们要释放对象,我们会调用free,这里注意要对计数记性判断,如果是0的话,那么就会销毁. #import <Foundation/Foundation.h> int cnt = 0; void fun (charchar * p) { printf("%c\n",p[0]); } charchar * retain1(charchar * p) { //retai

Linux内核中的内存管理浅谈

 [十月往昔]--Linux内核中的内存管理浅谈 为什么要叫做"十月往昔"呢?是为了纪念我的原博客. 不知道为什么,突然想来一个新的开始--而那个博客存活至今刚好十个月,也有十个月里的文档. 十月往昔,总有一些觉得珍贵的,所以搬迁到这里来. 而这篇文章是在09.04.20-09.04.21里写的. Jason Lee   ------------–cut-line   1.基本框架(此处主要谈页式内存管理) 4G是一个比较敏感的字眼,早些日子,大多数机器(或者说操作系统)支持的内存上限

6.关于QT中的内存管理,动态的制作,动态库的调用,静态库的制作

 一  QT的内存管理 1  QT中的内存管理是QObject来管理的 2  QT中的内存管理没有cocos2dx中的引用计数 3  组件可以指定父对象 QTimer *timer = QTimer(this);   //这里的this实际上强制转换成为了QObject了. 4  每一个对象都有一个deleteLater()方法, QLineEdit* edit = new QLineEdit(this);   delete edit;   //这里的delete马上调用析构函数对内存进行释

通过案例深入探讨PHP中的内存管理问题

问题  内存管理对于长期运行的程序,例如服务器守护程序,是相当重要的影响:因此,理解PHP是如何分配与释放内存的对于创建这类程序极为重要.本文将重点探讨PHP的内存管理问题. 一. 内存 在PHP中,填充一个字符串变量相当简单,这只需要一个语句"<?php $str = 'hello world '; ?>"即可,并且该字符串能够被自由地修改.拷贝和移动.而在C语言中,尽管你能够编写例如"char *str = "hello world ";&