C++动态内存开辟与释放new和delete

简介: new和delete

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

🐰new和delete

new和delete运算符是C++管理内存的方式,在C语言里实现近似功能的函数是malloc和free。

malloc函数原型:

void* malloc(int size);

向系统申请分配指定的size字节的内存空间,返回类型是void*类型

free函数原型:

void free(void* block);

把block所指向的空间释放。形参是void*类型,所以free可以释放任意类型的指针

C语言的内存管理是通过函数进行的,优点缺点如下:

(1)函数返回值是void*类型,在将这个地址给指针进行赋值时,必须进行强制类型转换。

(2)分配内存单元时根据参数size的值来分配的,如果size是错误的,系统仍然分配单元,无法检查出错误。

C++提供了简便而功能较强的运算符new和delete。

new是C++新增的用来用来动态申请内存的运算符,它的作用是申请到一段指定数据类型大小的内存。

使用格式:

指针变量 =new 数据类型;

使用new分配整形内存单元:

1. #include<iostream>
2. using namespace std;
3. int main()
4. {
5.     int* p=nullptr;
6.     p=new int;//new将申请一个整形的内存空间,将这个内存空间的首地址存放到指针变量p中
7.     cout<<*p<<endl;
8.     return 0;
9. }
10. 结果:0
11. 向内存动态申请了一整形空间,因为没有给空间赋值,所以里面是随机值,这里是0

使用new申请内存更加方便,而且new返回所申请数据类型的指针,再将内存的首地址给指针p时不需要强制类型转换

通过new运算符申请的内存单元是当程序运行到包含new语句时才分配的,称为动态内存的分配,这是堆上申请的空间,除非程序退出,才会把内存归还给系统。所以必须自己去释放通过new得到的内存单元

与new对应的释放内存空间运算符是delete,使用delete的格式如下:

delete 指针变量;

delete将释放指针所指向的内存单元:

1. #include<iostream>
2. using namespace std;
3. int main()
4. {
5.     int* p=nullptr;
6.     p=new int;//new将申请一个整形的内存空间,将这个内存空间的首地址存放到指针变量p中
7.     cout<<*p<<endl;
8.     delete p;//delete将释放p所指向的内存单元
9.     p=nullptr;
10.     return 0;
11. }

new也可以在申请内存空间的同时对该内存空间进行初始化

1. 指针变量=new 数据类型(初值);//传统圆括号初始形式
2. 指针变量=new 数据类型{初值};//C++11引入的列表初始化
3. 例如:
4. int* p=new int(520);
5. int* p=new int{520};

new和delete除了用于分配和释放单个变量的空间。还可以分配和释放连续变量的存储空间。例如申请一个数组空间,使用new[]和delete[]

new[]

1. 指针变量=new 数据类型[元素个数];
2. int* p=new int[10];
3. 可以申请存放20个整数的连续空间

delete[]

1. delete []指针变量;
2. delete []p;
3. p=nullptr;

🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸



相关文章
|
16天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
19天前
|
存储 C语言 C++
【C++打怪之路Lv6】-- 内存管理
【C++打怪之路Lv6】-- 内存管理
34 0
【C++打怪之路Lv6】-- 内存管理
|
24天前
|
C++
C/C++内存管理(下)
C/C++内存管理(下)
44 0
|
24天前
|
存储 Linux C语言
C/C++内存管理(上)
C/C++内存管理(上)
34 0
|
27天前
|
Linux C++
Linux c/c++文件虚拟内存映射
这篇文章介绍了在Linux环境下,如何使用虚拟内存映射技术来提高文件读写的速度,并通过C/C++代码示例展示了文件映射的整个流程。
37 0
|
19天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
21 4
|
19天前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
18 4
|
19天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
17 1
|
29天前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
29天前
|
编译器 C++
【C++类和对象(中)】—— 我与C++的不解之缘(四)
【C++类和对象(中)】—— 我与C++的不解之缘(四)