当前位置: 首页 > 编程笔记 >

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

呼延明朗
2023-03-14
本文向大家介绍C++基础入门教程(五):new和delete,包括了C++基础入门教程(五):new和delete的使用技巧和注意事项,需要的朋友参考一下

对于以前没有接触过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暂时到这里。
但关于指针的初步介绍还有一小部分,下一篇再介绍吧~

 类似资料:
  • 本教程于2015年7月开始撰写,耗时半年,总共148节,涵盖了Android基础入门的大部分知识,由于当时能力局限,虽已竭尽全力,但对于一些问题的分析难免有所纰漏,敬请读者海涵!IT技术更新换代很快,想想2015年还是Android 5.1横行,如今到了2018年都已经Android 8.0了,开发工具Android Studio也更新到了Android Studio 3.0.1。本系列的教程可能

  • D3 代表 Data-Driven Documents 。D3.js 是一个用于根据数据操作文档的 JavaScript 库。D3.js 是一个动态的,交互式的在线数据可视化框架,用于大量网站。

  • 第一章主要目的是让一个基本没有计算机图形基础的学员快速入门WebGL,建议大家按照顺序去阅读,不要跳过一些小节。其它的章节,大家可以根据个人需要,随意点击学习都可以。

  • 基础 稍微有一定的HTML/CSS/JavaScript基础,就可学习本课程,如果想实战开发Web3D项目,除了Three.js,前端还是需要深入学习。 学习顺序 初学者,按照顺序阅读 0.学前内容 和 1.快速入门 两章,其他章节可以根据需要选择性学习,内容比较多,也可以当成手册使用,用到某个功能的时候查询一下。 学习建议 电子书的知识讲解详细程度很难照顾基础不同的学员,阐述风格也很难兼容每个读

  • 本文向大家介绍C++基础入门教程(八):函数指针,包括了C++基础入门教程(八):函数指针的使用技巧和注意事项,需要的朋友参考一下 最近事情比较多,其实并不忙,就是事情比较影响思绪,所以都没心思写文章了。 今天主要说说函数的一些基本情况吧,同时也解释一下新手最容易迷糊的——什么时候要用指针参数? 一、函数原型和函数定义 大家都知道,C++定义函数之前,还需要声明函数原型,对于习惯Java等其他高级

  • 本文向大家介绍Bootstrap零基础入门教程(二),包括了Bootstrap零基础入门教程(二)的使用技巧和注意事项,需要的朋友参考一下 什么是 Bootstrap? Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架。Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的。 历史 Bootstrap 是由 Twitter 的 Mark Otto 和 Jac