new和delete是在c++中用来动态开辟和释放内存的关键字;这就不得不提起在c中经常使用的malloc函数和free函数开辟和释放内存;
目录
一、那么,首先回顾一下malloc和free的用法定义和特点:
二、接下来,我们看看c++中new和delete关键字的定义和特点;
一、那么,首先回顾一下malloc和free的用法定义和特点:
定义:
malloc函数原型:void * malloc(size_t size);用来在堆上动态开辟内存;
free函数原型:void free(void *ptr);用来释放内存;
动态开辟的特点:
1.堆上开辟;
2.是一个函数;
3.不可初始化;
4.开辟失败,指针放回空;
5.不能开辟常量内存块;
例如:
int *p1 = (int*)malloc(sizeof(int));
free(p1);
二、接下来,我们看看c++中new和delete关键字的定义和特点;
定义:
new:用来动态开辟内存
delete:用来释放空间以及资源;
动态开辟的特点:
1.在自主存取区域内开辟;
2.是一个关键字;
3.可初始化;
4.开辟失败后,会抛出异常;
5.可开辟常量内存块;
例如:int *p2 = new int(10); //初始化为10;
delete p2;
三、那么,我们来看一下new和delete的具体使用:
1、动态开辟一维数组:
(1)c中malloc开辟
int *p = (int *)malloc(sizeof(int)*10);
free(p);
(2)c++中new开辟
int *p3 = new int[10];//动态开辟一个长度为10的数组
delete [] p3;
int *p4 = new [10]();//动态开辟一个长度为10的数组并初始化为0
delete [] p4;
const int *p5 = new const int (10);//开辟常量内存块,且一定要初始化,这里初始为10
delete [] p5;
const int p6 = new const int[10]();
//动态开辟常量数组并初始化为0 可以开辟成功,但一般情况不用,因为这里的数组值全为0 ,并且不能对其进行修改
delete [] p6;
2、动态开辟二位数组
(思路:先开辟一维数组,再在所开辟的一位数组的基础上再循环开辟)
(1)c中使用malloc开辟
int **p = (int **)malloc(sizeof(int *)*10);
for(int i = 0;i < 10;i++)
{
p[i] = (int*)malloc(sizeof(int)*10);
}
for(int i = 0;i < 10;i++)
{
free(p[i]);
}
free p;
(2)c++中使用new开辟
int **p1 = new int *[10];
for(int i = 0;i < 10;i++)
{
p1[i] = new int [10];
}
for(int i = 0;i < 10;i++)
{
delete[] p1[i];
}
delete[] p1;
四、重定位new:
int a;
char *p = new(&a)char('a');
在a的内存池中,开辟一块内存给p使用,即p指向该内存,此时内存为char型
将a的内存称为内存池,可以自主管理内存;如图所示: