C++基础入门教程(五):new和delete

所属分类: 软件编程 / C 语言 阅读数: 72
收藏 0 赞 0 分享

对于以前没有接触过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++中四种对象生存期和作用域以及static的用法总结分析

以下是对C++中四种对象生存期和作用域以及static的用法进行了详细的介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C++嵌套类与局部类详细解析

从作用域的角度看,嵌套类被隐藏在外围类之中,该类名只能在外围类中使用。如果在外围类之外的作用域使用该类名时,需要加名字限定
收藏 0 赞 0 分享

C++空类详解

以下是对C++中的空类进行了详细的介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C++之友元:友元函数和友元类详解

友元是一种允许非类成员函数访问类的非公有成员的一种机制。可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元
收藏 0 赞 0 分享

C++中返回指向函数的指针示例

int (*ff(int)) (int *,int);表示:ff(int)是一个函数,带有一个int型的形参,该函数返回int (*) (int *,int),它是一个指向函数的指针,所指向的函数返回int型并带有两个分别是Int*和int型的形参
收藏 0 赞 0 分享

C数据结构之单链表详细示例分析

以下是对C语言中的单链表进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C数据结构之双链表详细示例分析

以下是对c语言中的双链表进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

浅析如何在c语言中调用Linux脚本

如何在c语言中调用Linux脚本呢?下面小编就为大家详细的介绍一下吧!需要的朋友可以过来参考下
收藏 0 赞 0 分享

深入解析unsigned int 和 int

以下是对unsigned int和int进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

浅谈C++中的string 类型占几个字节

本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节
收藏 0 赞 0 分享
查看更多