C++:new和delete
我们之前在学习C语言的时候,学习过了如何申请动态内存和释放内存。当时用的是C++/C语言的标准库函数malloc/free,而new / delete 是 C++的运算符。
我们先来看几个问题:
①:那这里我们就要想一下,有了 malloc/free,为什么还要 new/delete?
答:对于非内部数据类型的对象而言,光用 maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于 malloc/free。
因此 C++语言需要一个能完成动态内存分配和初始化工作的运算符 new,以及一个能完成清理与释放内存工作的运算符 delete。
注意 new/delete 不是库函数。
②:既然 new/delete 的功能完全覆盖了 malloc/free,为什么 C++不把 malloc/free 淘汰出局呢?
答:这是因为 C++程序经常要调用 C 函数,而 C 程序只能用 malloc/free 管理动态内存。
new的使用:
一:我们先用new创建简单的内置类型空间:
例如:我们申请一块存放int类型的动态内存
int *p1 = (int *)malloc(sizeof(int));
int *p2 = new int;
我们只需要在调用new的时候,将要申请的数据类型告诉new即可,new会自己在堆中找一块合适的内存块,并将该内存块的地址返回出来,我们只需要用合适的指针去接收即可。
这是因为 new 内置了 sizeof、类型转换和类型安全检查功能。
还有一个知识点:malloc 只能开辟内存,不能初始化
new 不仅可以开辟,还可以初始化
我们可以在声明的数据类型后面用小括号()进行赋值。当()中为空时则初始化为0
比如上述代码:int *p2 = new int;
我们可以申请的时候并将其赋值为10:int *p2 = new int(10);
我们还可以用 new 来创建常量内存块: