您现在的位置是:首页 >技术交流 >【C/C++】基础知识之动态申请内存空间new-delete网站首页技术交流
【C/C++】基础知识之动态申请内存空间new-delete
创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>?<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
?c++系列专栏:C/C++零基础到精通 ?给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ
c语言内容?:
专栏:c语言之路重点知识整合
目录
一、c语言动态申请内存空间
c语言堆区malloc相关知识点:【c语言】五大内存区域 | 堆区详解
使用malloc将堆区创建一个存储空间并把局部变量存放进去,该数据如果不被手动回收,就会一直存放在堆区中。
释放完后将指针p赋值为NULL,避免野指针的出现
int* p = (int*)malloc(sizeof(int));
//...........
free(p);
p = NULL;
在C++中,有一种全新的方式用来在堆区动态申请内存空间——new
和delete
关键字
二、new-delete
使用new
关键字动态在堆区申请内存空间,new
关键字后 放 类型,返回的是对应类型的地址!!!
格式:new关键字 后加上类型名,在堆区申请该类型空间大小的空间
代替c语言中的malloc 还不用进行强转
例如:
int* p1 = new int;
*p1 = 1;
cout << *p1 << endl;
使用delete
代替c语言中的free
释放空间
但是delete不是函数,关键字后直接加上要释放空间的指针地址,仍然将指针p赋值为NULL:
int* p1 = new int;
*p1 = 1;
cout << *p1 << endl;
delete p1;
p1 = NULL;
基本数据
在int类型后加()
,可以赋予初始值
int* p2 = new int(7);
cout << *p2 << endl;
delete p2;
p2 = NULL;
如果未指定初始值,则初始值为0:
int* p3 = new int();
cout << *p3 << endl;
delete p3;
p3 = NULL;
数组
申请一个int型数组的堆区空间:
int* p4 = new int[3];
同样可以赋予初始值:
int* p4 = new int[3] {1,2,3};
for (int i = 0; i < 3; i++)
{
cout << p4[i] << " ";
}
与基本数据类型不同的是:在delete数组的时候,需要在指针前加[]
用来代表数组,二维数组同样
中括号[]放在前面,代表整个数组
例如:
delete []p4;
p4 = NULL;
注:
delete回收空间并不包含指针本身,而是指针指向的内存空间,同一块内存空间不要重复释放,除非指针已经被赋空,对空指针使用delete是安全的。
对栈区的内存空间不能使用delete来释放!
三、new指针、new数组
只需要牢记:
使用new
关键字动态在堆区申请内存空间,new
关键字后 放 类型,返回的是对应类型的地址!!!
就两种情况
- new指针——
- new数组——
1.new 整型指针
整型指针对应的地址:二级指针,因此为int ** p1
int** p1 = new int*;
delete p1;
p1 = NULL;
2.new 指针数组
指针数组相关知识点:【c语言】指针数组
指针数组对应的地址也是二级指针,因此为int ** p2
int** p2 = new int* [3];
delete []p2;
p2 = NULL;
3.new 数组指针
数组指针相关知识点:【c语言】数组指针
数组指针int(*p3)[3]
的指针 在类型上再加*
:int(**p3)[3]
int(**p3)[3] = new (int(*)[3]);
delete p3;
p3 = NULL;
4.new 整型的二维数组
指向二维数组的指针为:一维数组指针int(*p4)[3]
int(*p4)[3] = new int[2][3];
delete[]p4;
p4 = NULL;
5.new 函数指针
先随便定义一个函数:
void fun(int a)
{
cout << "TianXi Studio" << endl;
}
指向函数指针的地址:在函数指针void(*p5)(int)
基础上加*
:void(**p5)(int)
void(**p5)(int) = new (void (*)(int));
delete p5;
p5 = NULL;
总结
malloc-free和new-delete的区别
-
new、delete
是关键字,需要C++的编译器支持,malloc()、free()
是函数,需要头文件支持 -
new
申请空间不需要指定申请大小,根据类型自动计算,new
返回的是申请类型的地址,不需要强转,malloc()
需要显式的指定申请空间的大小(字节),返回void*
,需要强转成我们需要的类型。 -
new
申请空间的同时可以设置初始化,而malloc 需要手动赋值 -
malloc()
和free()
则不会调用构造、析构函数
在C语言中,常用的动态申请内存空间的函数是malloc、calloc
和realloc
,并且需要手动free
释放已分配的内存空间
而在C++中,可以使用new操作符来动态创建一个对象或一段对象数组
new
可以自动调用构造函数初始化对象,而delete
操作符则会自动调用析构函数,释放分配的内存空间(后面会提到)
使用delete
释放动态分配的对象数组时记得加上方括号,否则只会释放首个元素并不会将整个数组的内存空间都释放掉。
大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |