手机
当前位置:查字典教程网 >编程开发 >C语言 >C++基础入门教程(五):new和delete
C++基础入门教程(五):new和delete
摘要:对于以前没有接触过C++,然后初次接触Cocos2d-x的朋友来说,可能对于内存管理方面会比较生疏。也经常会因为内存问题导致各种小Bug,我...

对于以前没有接触过C++,然后初次接触Cocos2d-x的朋友来说,可能对于内存管理方面会比较生疏。

也经常会因为内存问题导致各种小Bug,我也曾经写过一篇retain和release倒底怎么玩?,用来驾驭Cocos2d-x的对象引用和释放也算是足够了。

但,难道大家就不想知道retain和release背后的秘密吗?(小若:不想。)

没错,今天木头来带大家走进科学,走进世界,一起来探讨C++的new和delete。(小若:没兴趣。)

好,既然大家都等不及了,那就开始吧~

1.动态分配内存

我们都知道,像“int num = 10;”这样的语句,声明了一个num变量,这个变量是需要内存来放置(就像你的文档需要硬盘来放置)。

对于这样的普通变量,是在编译的时候就分配好内存的。

没错,就像你出生的时候就决定了是男是女了。(小若:这个比喻感觉一点关系都扯不上啊!而且,谁说出生就决定的?!)

通过声明指针变量可以指向这些预先被分配好的内存地址,但,我们的指针可不仅仅是为此而存在的。

指针还可以保存动态分配的内存的地址。

那么,怎么动态分配内存呢?没错,就是new,如下代码:

复制代码 代码如下:

// 可以这样

int *p = new int;

// 还可以这样

int *p = new int();

// 使用

*p = 20;

// 最后,要释放内存

delete p;

通过new后面跟着类型,就可以创建用于保存某种类型的内存空间,然后返回这个内存空间的地址。

它和直接声明int变量的区别是:

1.new出来的变量在运行程序的时候才会申请内存,普通int变量在编译的时候就分配了内存;

2.new出来的变量在不使用的时候需要释放掉,否则会内存泄露,使用delete即可释放指针指向的内存空间。

2.new和delete的配对

动态申请的内存,在不使用的时候,一定不要忘了释放掉,否则会造成内存泄露。

粗俗地说,不,通俗地说,动态申请了内存,其实只不过是告诉操作系统,这块内存归我了,其他人不能使用。

操作系统会乖乖地把你申请的那块内存给你用,如果你没有明确告诉它你不需要这块内存,则这内存永远都只能由你来使用。(当然,会有意外情况的,这个忽略)

所以,绝对不要忘记,在不使用的时候,要delete掉。

只要你new了一个变量,那就必须有对应的delete。

3.new、delete与reatin、release的关系

现在来看看Cocos2d-x内存管理,它就是为了让我们可以忽略new和delete的配对而诞生的。

谁没事想天天记着自己在哪里new了,又在哪里忘了delete呢?

所以,retain和release诞生了。

Cocos2d-x的大部分对象都是使用create函数创建的,而create函数里主要做了2件事情:

1.调用new创建新对象,也就是申请了内存

2.将对象添加到内存管理池(具体引用计数规则我就不说了)

而Cocos2d-x的内存管理主要做的一件事情是:

1.检查所以参与内存管理的对象,对那些需要释放的对象调用delete,释放内存

因此,我们不需要自己去维护new和delete,创建对象的时候,把对象交给内存管理就可以了。

如果我们不调用retain,那么,对象会在下一次内存管理检查的时候被释放(也就是下一帧)。

同时,addChild等函数都会主动调用一次对象的retain函数,所以被addChild的对象都不会被释放。

而在离开场景等操作时,对象也会被调用release函数,抵消一次retain的作用。

除非必要,否则,我们不需要主动调用retain函数,这就是“自动内存管理”的基本规则了。

4.动态数组

除了动态创建变量之外,数组也可以动态创建:int *nums = new int[10];

而对应的,释放动态数组有点特别:delete [] nums;

在delete后面需要加上一个[],代表释放的是数组。

动态数组的使用和一般数组差不多,当然,也有小差别:

复制代码 代码如下:

int *nums = new int[3];

nums[0] = 1;

nums[1] = 2;

nums[3] = 3;

cout << nums[0];

nums += 1;

cout << nums[0];

第一次使用cout输出nums[0]时,输出的就是第一个元素的值:1。

但是,当调用了nums += 1时,指针nums已经指向了下一个地址,也就是nums[1]所在的地址。

所以,这时候再调用nums[0],输出的也是第一个元素的值,但此时的第一个元素已经不是1,而是2了。

5.结束

好了,关于new和delete暂时到这里。

但关于指针的初步介绍还有一小部分,下一篇再介绍吧~

【C++基础入门教程(五):new和delete】相关文章:

C中实现矩阵乘法的一种高效的方法

c++基础语法:构造函数与析构函数

C++中用指向数组的指针作函数参数

C字符串操作函数的实现详细解析

C 语言基础教程(我的C之旅开始了)[四]

函数外初始化与函数内初始化详细解析

C 语言基础教程(我的C之旅开始了)[六]

C 语言基础教程(我的C之旅开始了)[九]

基于memset()函数的深入理解

解析在Direct2D中画Bezier曲线的实现方法

精品推荐
分类导航