1.为什么要有new?

为什么要有new?为什么要动态创建对象?为什么有时候不用new,有时候又用new,比如:

  1. // Cocos2d-x3.x的Value类,大家都很熟悉了
  2. Value v = Value(100);
  3. // Cocos2d-x的Sprite类,也很属性了
  4. Sprite* sp = new Sprite();

为什么有些地方不用new,有些地方又要new呢?

这就涉及到自动存储和动态存储了。

2.自动存储(自动变量、局部变量)

自动存储,也叫做自动变量,比如int num = 10; 这个num就属于自动变量。

所谓自动,代表它会自动申请内存,也会自动释放内存,自动变量是保存在栈里的(后进先出)。

如果大家觉得很难理解,那么,换一个名称——局部变量。

这个好理解了吧?局部变量在离开函数,或者离开它所属的代码块之后,就会被释放。

而Value v = Value(100); 、int num = 10; 这些都是局部变量,一旦离开函数或者离开它的作用域,就会被释放。

比如把int num; 作为成员变量,那么,在这个类被释放的时候,num变量也会被释放。

这就是为什么我们在创建了这么多int、float等基本类型的变量之后,不需要去释放它们。

因为它们是自动被释放的。

3.动态存储

自动变量有很大的好处,那就是不需要我们去管内存方面的事情,但是,有时候我们不希望有这样的自动释放内存。

我们希望自己去控制什么时候释放对象,这时候就要用到new了。

我们都知道,new了之后,如果不调用相应delete的话,申请到的内存空间是永远都不会被释放的。

这就是动态存储了,我们自己来申请内存,自己来释放内存。

当然,内存泄露的罪魁祸首之一也正是new~!

因为正常人都会有疏忽的时候,并且当程序足够庞大、逻辑足够复杂的时候,有些地方调用了new,却疏忽了delete是再正常不过了。

当然,new的作用也许不仅于此,书上目前还没深入介绍,我也不多说,免得说错,毕竟C++还是需要严谨一些的~

我不敢乱吹水~

C++为啥要使用new的更多相关文章

  1. (视频)《快速创建网站》 4.1 为啥造软件不同于造汽车,为啥是软件就一定会有Bug - 构建开发运维一体化(DevOps)

    本文是<快速创建网站>系列的第9篇,如果你还没有看过之前的内容,建议你点击以下目录中的章节先阅读其他内容再回到本文. 访问本系列目录,请点击:http://devopshub.cn/tag ...

  2. ARM你必须知道的事儿——为啥“PC = PC + 8”?

    为啥是“PC = PC + 8”: “PC = PC + 8”其实这样写容易让人蒙了.“PC = PC + 8”真正含义应该是: 执行处代码地址 = PC - 8: 也就是说,”PC指向的地址“领先“ ...

  3. (转载)为啥我们要学习Linux

    学习Linux也有一阵子了,这过程中磕磕撞撞的,遇到了问题,也解决了一些问题,学习的路子是曲折的,想总结点啥的,让刚刚学习Linux的不会望而生畏. 为啥我们要学习Linux 技术的价值不在于这个技术 ...

  4. 为啥NSString的属性要用copy而不用retain

    之前学习生活中,知道NSString的属性要用copy而不用retain,可是不知道为啥,这两天我研究了一下,然后最终明确了. 详细原因是由于用copy比用retain安全,当是NSString的时候 ...

  5. 为啥都不用Qt Quick Controls 2呢

     为啥都不用Qt Quick Controls 2呢  https://github.com/qt/qtquickcontrols2/ 

  6. git add --all 为啥不能添加空文件夹,这样设计的初衷是

    git add --all 为啥不能添加空文件夹,这样设计的初衷是? 好多项目还得弄个假文件在空文件夹里面占位 这个算设计失误吧,见 https://git.wiki.kernel.org/index ...

  7. 一个网友写的栈,问为啥不能迭代。具有__iter__ 和next方法的对象叫迭代器-七七巴巴黄页网

    一个网友写的栈,问为啥不能迭代.具有__iter__ 和next方法的对象叫迭代器-七七巴巴黄页网 一个网友写的栈,问为啥不能迭代.具有__iter__ 和next方法的对象叫迭代器 python视频 ...

  8. javascript 为啥不用instanceof检测数组,这里有一个示例坑

    前些天写js遇到了一个instanceof的坑,我们的页面中有一个iframe,我在index页面中计算得到了一个array,然后需要传递到Flight页面 这个嵌套的iframe中的一个函数(Sea ...

  9. arm的编译器里已经有C标准库的lib包了,android为啥还要自己再实现呢

    arm的编译器里已经有C标准库的lib包了,android为啥还要自己再实现呢 google自己搞的bionic libc来替代glibc想来是有原因的,本来glibc也是lgpl,应该也没有版权问题 ...

  10. 分析下为什么spring 整合mybatis后为啥用不上session缓存

    因为一直用spring整合了mybatis,所以很少用到mybatis的session缓存. 习惯是本地缓存自己用map写或者引入第三方的本地缓存框架ehcache,Guava 所以提出来纠结下 实验 ...

随机推荐

  1. cxGrid 怎样才能让不自动换行 WordWrap:=false

    cxGrid 怎样才能让不自动换行 WordWrap:=false 2014-12-26 02:04:03|  分类: delphi|举报|字号 订阅     下载LOFTER我的照片书  |     ...

  2. ReportMachine 自定义代码 画细线

    ReportMachine 自定义代码 画细线 procedure Memo3_OnBeforePrint(Sender: TObject); begin Memo3.Text := inttostr ...

  3. 关于tableview下拉刷新崩溃的问题

    逻辑应该是这样的:1. 下拉2. 达到下拉临界值以后再请求网络数据3. 待数据加载到本地以后才更新 data source4. reload tableview 如果先清空再下拉,后果就是往下拉的距离 ...

  4. title

    事实上 @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import ur ...

  5. ASP.NET中实现回调

    一.引言 在ASp.NET网页的默认模型中,用户通过单击按钮或其他操作的方式来提交页面,此时客户端将当前页面表单中的所有数据(包括一些自动生成的隐藏域)都提交到服务器端,服务器将重新实例化一个当前页面 ...

  6. jquery基于form-data文件上传

    1.html代码 <input type="file" name="myupdate" id="myupdate"> 2.jav ...

  7. Python:windows下scikit-learn 安装和更新

    scikit-learn 报错: from sklearn.model_selection import train_test_split ImportError: No module named m ...

  8. 基于opencv3.0下的人脸检测和检测部分的高斯模糊处理

    如题 这里将任务分解为三大部分: 1.录播放视频 2.人脸检测 3.部分高斯模糊 其中重点放在人脸检测和部分高斯模糊上 1.录播放视频(以opencv中的VideoCapture类进行实现) 首先罗列 ...

  9. Nginx 负载均衡和反向代理实践

    nginx 以哪个配置文件启动 Nginx 负载均衡和反向代理实践 环境介绍 192.168.1.50    在这台主机上配置Nginx 的反向代理,负载均衡,和web1,web1使用的81号端口 1 ...

  10. 设置 Linux 下打印机的几种方式

    设置 Linux 下打印机的几种方式 一.使用 cups 进行设置 如若遇到 cups 也没有驱动的话可以前往 openprinting.org 找寻对应驱动. 二.前往 official 下载驱动 ...