源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-08-03 11:46 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:C++基础入门教程(五):new和delete
对于以前没有接触过C++,然后初次接触Cocos2d-x的朋友来说,可能对于内存管理方面会比较生疏。 也经常会因为内存问题导致各种小Bug,我也曾经写过一篇retain和release倒底怎么玩?,用来驾驭Cocos2d-x的对象引用和释放也算是足够了。 但,难道大家就不想知道retain和release背后的秘密吗?(小若:不想。)   没错,今天木头来带大家走进科学,走进世界,一起来探讨C++的new和delete。(小若:没兴趣。)   好,既然大家都等不及了,那就开始吧~ [b]1.动态分配内存[/b] 我们都知道,像“int num = 10;”这样的语句,声明了一个num变量,这个变量是需要内存来放置(就像你的文档需要硬盘来放置)。 对于这样的普通变量,是在编译的时候就分配好内存的。 没错,就像你出生的时候就决定了是男是女了。(小若:这个比喻感觉一点关系都扯不上啊!而且,谁说出生就决定的?!)   通过声明指针变量可以指向这些预先被分配好的内存地址,但,我们的指针可不仅仅是为此而存在的。 指针还可以保存动态分配的内存的地址。 那么,怎么动态分配内存呢?没错,就是new,如下代码:
[u]复制代码[/u] 代码如下:
// 可以这样 int *p = new int; // 还可以这样 int *p = new int(); // 使用 *p = 20; // 最后,要释放内存 delete p;
通过new后面跟着类型,就可以创建用于保存某种类型的内存空间,然后返回这个内存空间的地址。 它和直接声明int变量的区别是: 1.new出来的变量在运行程序的时候才会申请内存,普通int变量在编译的时候就分配了内存; 2.new出来的变量在不使用的时候需要释放掉,否则会内存泄露,使用delete即可释放指针指向的内存空间。 [b]2.new和delete的配对[/b] 动态申请的内存,在不使用的时候,一定不要忘了释放掉,否则会造成内存泄露。 粗俗地说,不,通俗地说,动态申请了内存,其实只不过是告诉操作系统,这块内存归我了,其他人不能使用。 操作系统会乖乖地把你申请的那块内存给你用,如果你没有明确告诉它你不需要这块内存,则这内存永远都只能由你来使用。(当然,会有意外情况的,这个忽略)   所以,绝对不要忘记,在不使用的时候,要delete掉。 只要你new了一个变量,那就必须有对应的delete。 [b]3.new、delete与reatin、release的关系[/b] 现在来看看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函数,这就是“自动内存管理”的基本规则了。 [b]4.动态数组[/b] 除了动态创建变量之外,数组也可以动态创建:int *nums = new int[10]; 而对应的,释放动态数组有点特别:delete [] nums; 在delete后面需要加上一个[],代表释放的是数组。   动态数组的使用和一般数组差不多,当然,也有小差别:
[u]复制代码[/u] 代码如下:
 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了。 [b]5.结束[/b] 好了,关于new和delete暂时到这里。 但关于指针的初步介绍还有一小部分,下一篇再介绍吧~
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部