C++为啥要使用new

简介: 1.为什么要有new? 为什么要有new?为什么要动态创建对象?为什么有时候不用new,有时候又用new,比如: // Cocos2d-x3.x的Value类,大家都很熟悉了 Value v = Value(100); // Cocos2d-x的Sprite类,也很属性了 Sprite* sp = new Sprite(); 为什么有些地方不用new,有些地方又要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++还是需要严谨一些的~

我不敢乱吹水~

目录
相关文章
|
4月前
|
存储 Java 编译器
C++:内存管理|new和delete
C++:内存管理|new和delete
|
4月前
|
存储 算法 编译器
【C++ 内存管理 重载new/delete 运算符 新特性】深入探索C++14 新的/删除的省略(new/delete elision)的原理与应用
【C++ 内存管理 重载new/delete 运算符 新特性】深入探索C++14 新的/删除的省略(new/delete elision)的原理与应用
137 0
|
24天前
|
C++
C++(十九)new/delete 重载
本文介绍了C++中`operator new/delete`重载的使用方法,并通过示例代码展示了如何自定义内存分配与释放的行为。重载`new`和`delete`可以实现内存的精细控制,而`new[]`和`delete[]`则用于处理数组的内存管理。不当使用可能导致内存泄漏或错误释放。
|
1月前
|
存储 程序员 编译器
c++学习笔记08 内存分区、new和delete的用法
C++内存管理的学习笔记08,介绍了内存分区的概念,包括代码区、全局区、堆区和栈区,以及如何在堆区使用`new`和`delete`进行内存分配和释放。
40 0
|
2月前
|
NoSQL 编译器 Redis
c++开发redis module问题之如果Redis加载了多个C++编写的模块,并且它们都重载了operator new,会有什么影响
c++开发redis module问题之如果Redis加载了多个C++编写的模块,并且它们都重载了operator new,会有什么影响
|
2月前
|
存储 C语言 C++
【C/C++】动态内存管理( C++:new,delete)
C++的`new`和`delete`用于动态内存管理,分配和释放内存。`new`分配内存并调用构造函数,`delete`释放内存并调用析构函数。`new[]`和`delete[]`分别用于数组分配和释放。不正确匹配可能导致内存泄漏。内置类型分配时不初始化,自定义类型则调用构造/析构。`operator new`和`operator delete`是系统底层的内存管理函数,封装了`malloc`和`free`。定位`new`允许在已分配内存上构造对象,常用于内存池。智能指针等现代C++特性能进一步帮助管理内存。
|
2月前
|
NoSQL Redis C++
c++开发redis module问题之避免多个C++模块之间因重载operator new而产生的冲突,如何解决
c++开发redis module问题之避免多个C++模块之间因重载operator new而产生的冲突,如何解决
|
3月前
|
C++
C/C++内存管理(2):`new`和`delete`的实现原理
C/C++内存管理(2):`new`和`delete`的实现原理
|
3月前
|
安全 C++ 开发者
C++一分钟之-动态内存管理:new与delete
【6月更文挑战第19天】在C++中,`new`和`delete`用于动态内存管理,分配和释放堆内存。不正确使用可能导致内存泄漏和悬挂指针。要避免这些问题,确保每次`new`都有匹配的`delete`,释放内存后设指针为`nullptr`。使用`delete[]`释放数组,避免重复释放。智能指针如`std::unique_ptr`可自动管理内存,减少手动管理的风险。通过实例展示了如何使用智能指针进行安全的内存操作。
42 4
|
2月前
|
C++
C++基础知识(二:引用和new delete)
引用是C++中的一种复合类型,它是某个已存在变量的别名,也就是说引用不是独立的实体,它只是为已存在的变量取了一个新名字。一旦引用被初始化为某个变量,就不能改变引用到另一个变量。引用的主要用途包括函数参数传递、操作符重载等,它可以避免复制大对象的开销,并且使得代码更加直观易读。