C语言动态内存
在C语言中动态申请内存依赖于三个函数:
- malloc,开辟以字节为单位的指定空间
- calloc,开辟以字节为单位的指定空间,并将其初始化为0
- realloc,用于将动态开辟的内存进行扩容,根据情况进行原地或者异地扩容
而用于释放动态申请的空间则用free,一般来说再将指向该空间的指针置为NULL最好。
C++动态内存
因为C++是兼容C语言的,所以以上动态申请空间的方法于C++也是适用的,但是C++新增了两个更好用的关键字new和delete。
区别:
- new、delete是关键字,而malloc、calloc、realloc是函数
- 对于内置类型两者间没有区别,对于自定义类型,malloc、calloc只会开辟空间,而new会开辟空间,然后调用自定义类型的构造函数
- 对于内置类型free和delete也没有区别,但是对于自定义类型,delete会先调用其析构函数,在释放空间
使用语法:
new:
int main()
{
//申请一个空间
int* a = new int;
//申请一片连续的空间
int* b = new int[10];
return 0;
}
另外new也是支持申请空间后初始化的,如下:
int main()
{
//初始化
int* a = new int(10);
//不连续初始化,后面默认为0
int* b = new int[10]{ 1,2,3,4,5 };
//完全初始化
int* c = new int[10]{ 1,2,3,4,5,6,7,8,9,10 };
return 0;
}
delete:
int main()
{
//申请一个空间
int* a = new int;
//申请一片连续的空间
int* b = new int[10];
//释放申请的一个空间
delete a;
//释放申请的一片连续的空间
delete[] b;
return 0;
}
注意:new与delete要配套使用,何为配套使用?只new一个空间,那么释放就是delete;new了一片连续的空间,释放就要delete[ ],即:
- new —— delete
- new type[ ] —— delete[ ]
new type[ ]如果开辟的类型是自定义类型的话,开辟多少个自定义类型,就会调用多少次构造函数,delete[ ]也是如此,开辟多少个自定义类型,就会调用多少次析构函数,平且是先析构在释放。