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

2020-01-06 13:12:03王旭

 
所以,绝对不要忘记,在不使用的时候,要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暂时到这里。