C++学习笔记 —— 内存分配 new

cpp 复制代码
//创建数值
int *pi = new int; //pi指向动态分配的,未初始化的无名对象
delete pi;
int *pi = new int(10); //pi指向动态分配的,初始化10
delete pi;

//创建数组
int *a = new int[5];  //创建一个数组,未初始化数值
delete []a;  // new 和 delete 必须对应使用,new 创建一组对象,那么 delete 就要释放一组对象
int *a = new int[5]{1,2,3,4,5};//创建数组,初始化数值
int *a = new int[get_size()]; //可以使用变量创建数组

//创建类
class A { ... };  // 声明一个类 A
A *obj = new A();  // 使用 new 创建对象
delete obj;

【分析】

这里我们需要注意,new int[5] 仅仅分配了空间,但是 new A(),不仅仅为对象 obj 在堆上分配了空间,而且还调用了 A的构造函数,生成了这个对象

所以 new A() 这样方式的功能如下:

  1. 在堆上分配空间
  2. 在分配空间上调用对象的构造函数(这也是 new 和 malloc 的主要区别,是否调用构造函数)

同理,在调用 delete obj 的时候

  1. 首先调用 这个对象 的析构函数
  2. 然后释放这个对象的空间

用系统默认的 malloc() 分配的内存要交给系统默认的 free() 去释放;

用系统默认的 new 表达式创建的对象要交给系统默认的 delete 表达式去析构并释放;

用系统默认的 new[] 表达式创建的对象要交给系统默认的 delete[] 表达式去析构并释放;

new 和malloc区别

  1. new/delete 是C++中的运算符。malloc/free 是函数
  2. malloc 申请内存空间时,手动计算所需大小,new 只需要类型名,自动计算大小
  3. malloc 申请的内存空间不会初始化,new 可以初始化(需要调用构造函数)
  4. malloc 的返回值为 void*,接受时必须强转,new不需要
  5. malloc 申请内存空间失败时,返回的是NULL,使用时必须判空;new申请内存空间失败时会抛出异常(可以加上 nothrow),所以要有捕获异常处理程序
cpp 复制代码
struct Mystruct {
	int a;
	int b;
};
int main()
{
	int * ptr = (int *) malloc( sizeof(int)*10 );//分配一个10个int元素的数组
	int * ptr = new int[10];//分配一个10个int元素的数组

	Mystruct *my = (struct Mystruct*) malloc(sizeof(struct Mystruct)); //不会初始化成员
	Mystruct *my = new Mystruct(); //会自动初始化成员为0

}
相关推荐
运维技术小记4 分钟前
这个 MIT 学生用 AI 学习法两天搞定一门课的方法,颠覆认知!
人工智能·学习
Huangjin007_8 分钟前
【C++ STL篇(四)】一文拿捏vector常用接口!
开发语言·c++·学习
渡我白衣10 分钟前
触类旁通——迁移学习、多任务学习与元学习
人工智能·深度学习·神经网络·学习·机器学习·迁移学习·caffe
草莓熊Lotso10 分钟前
Linux 线程同步与互斥(一):彻底搞懂线程互斥原理、互斥量底层实现与 RAII 封装
linux·运维·服务器·开发语言·数据库·c++
kobesdu14 分钟前
【ROS2实战笔记-6】RobotPerf:机器人计算系统的基准测试方法论
笔记·机器人·ros
j_xxx404_14 分钟前
力扣算法题:字符串(最长公共前缀|最长回文子串)
c++·算法·leetcode
承渊政道16 分钟前
【递归、搜索与回溯算法】(穷举vs暴搜vs深搜vs回溯vs剪枝:一文讲清概念与用法)
数据结构·c++·算法·决策树·深度优先·剪枝·宽度优先
敢敢のwings17 分钟前
NVIDIA Isaac GR00T与Cosmos:重塑机器人学习的合成数据革命
学习·机器人
承渊政道17 分钟前
【递归、搜索与回溯算法】(综合练习:一网打尽常见题型分类总结与方法归纳)
c++·算法·决策树·分类·深度优先·哈希算法·宽度优先
我不是懒洋洋19 分钟前
【数据结构】栈和链表基本方法的实现
c语言·开发语言·数据结构·c++·链表·青少年编程·ecmascript