在
C
中使用
malloc
,
free
来动态申请、释放堆区内存空间,使用时需要显式的指定申请空间的大小。 而在C++
中使用两个关键字:
new
,
delete
来动态申请、释放空间,同样操作的是
堆区。
new的使用:
new 申请空 间不需要指定空间大小,而是指定类型,根据类型自动计算所需要的空间大小,并返回申请内存空间的地址,地址指向的类型为new 后写的类型,格式:数据类型* 指针名= new 数据类型.
int* p1 = new int;
int* p2 = new int(10);//申请空间并初始化
new 数组返回的是首元素的首地址。
int *parr1 =new int[10];
int *parr2 =new int[10](); //新建int类型数组并初始化,每个元素为0
char *parr3 =new char[10](); //新建char类型数组并初始化,每个元素为空字符'\0'
delete的使用:
delete
回收空间并不包含指针本身,而是指针指向的内存空间,同一块内存空间不要重复释放,除非指针已经被赋空,对空指针使用delete
是安全的。对栈区的内存空间不能使用
delete来释放。对于数组空间回收,在指针前一般加上
[]
,代表回收整个数组空间。
delete p1;
delete[] parr1;
new delete 与 malloc free的区别
1. new
、
delete
是关键字 需要
C++
的编译器支持,
malloc()
、
free()
是函数,需要头文件支持。
2. new
申请空间不需要指定申请大小,根据类型自动计算,
new
返回的是申请类型的地址,不需要强转,malloc()
需要显式的指定申请空间的大小(字节),返回
void*
,需要强转成我们需要的类型。
3. new
申请空间的同时可以设置初始化,而
malloc
需要手动赋值。
4.
至关重要的一点:
new
申请类、结构体对象内存空间会自动调用构造函数,
delete
会自动调用
类、结构体的析构函数,单独的
malloc()
和
free()
则不会调用构造、析构函数
。