new和delete是在c++中用来动态开辟和释放内存的关键字;这就不得不提起在c中经常使用的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);
定义:
new:用来动态开辟内存
delete:用来释放空间以及资源;
动态开辟的特点:
1.在自主存取区域内开辟;
2.是一个关键字;
3.可初始化;
4.开辟失败后,会抛出异常;
5.可开辟常量内存块;
例如:int *p2 = new int(10); //初始化为10;
delete p2;
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;
int a;
char *p = new(&a)char('a');
在a的内存池中,开辟一块内存给p使用,即p指向该内存,此时内存为char型
将a的内存称为内存池,可以自主管理内存;如图所示:
联系客服