C++为啥要使用new

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++还是需要严谨一些的~

我不敢乱吹水~

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java面试通关手册

深入理解原型模式 ——通过复制生成实例

Java面试通关手册(Java学习指南,欢迎Star,会一直完善下去,欢迎建议和指导):https://github.com/Snailclimb/Java_G...

1793
来自专栏三丰SanFeng

Linux64位程序移植

1 概述 Linux下的程序大多充当服务器的角色,在这种情况下,随着负载量和功能的增加,服务器所使用内存必然也随之增加,然而32位系统固有的4GB虚拟地址空间限...

2397
来自专栏王清培的专栏

.NET项目开发—浅谈面向对象的纵横向关系、多态入口,单元测试(项目小结)

阅读目录: 1.开篇介绍 2.使用委托消除函数串联调用 2.1.使用委托工厂转换两个独立层面的对象 3.多态入口(面向对象继承体系是可被扩展的) 4.多态的受...

19310
来自专栏用户2442861的专栏

Java面试题全集(上)

http://blog.csdn.net/jackfrued/article/details/44921941

922
来自专栏Zephery

工厂模式

工厂模式 目录 何为工厂模式 工厂方法与抽象工厂 如何在Java EE中通过@Producers与@Inject注解实现工厂模式 如何创建自定义注解以及通过@Q...

40911
来自专栏LhWorld哥陪你聊算法

【Linux篇】--sed的用法

Sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pat...

562
来自专栏算法channel

面试被问到动态内存分配时需要注意哪些坑,该怎么回答?

面试时,面试官问我们Java,Python这种语言那是必须要准确回答的,很多系统如果对性能要求高的话,底层一般会用到C/C++语言,因此被问到底层语言的相关知识...

1313
来自专栏安恒网络空间安全讲武堂

​CTF逆向——常规逆向篇(下)

CTF逆向——常规逆向篇(下) 题目: CrackMe.exe(NSCTF reverse第一题) WHCTF2017 reverse HCTF reverse...

3275
来自专栏玩转JavaEE

MongoDB管道操作符(一)

熟悉Linux操作系统的小伙伴们应该知道Linux中有管道的说法,可以用来方便的处理数据。MongoDB2.2版本也引入了新的数据聚合框架,一个文档可以经过多个...

3335
来自专栏MyBlog

Effective Java 读书笔记(7)避免finalizer

对于Finalizers他们的使用可能会造成错误的产生,糟糕的性能以及移植性的问题,当然Finalizers有着一些有用的优点,我们会在后续介绍这些,但是作为首...

1002

扫码关注云+社区