关闭

Cocos2d-x开发中C++内存管理

发表于:2015-1-29 11:04

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:zfyouxi    来源:51Testing软件测试网采编

  因为開始并没有介绍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.
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号